2010-12-20 69 views
1

我的源文件看起来像这样:XSLT,如何“扁平化”的标签结构未知数量的子标签

<x> 
<names> 
     <name>name1</name> 
     <name>name2</name> 
</names> 
<codes> 
     <code>code1</code> 
     <code>code2</code> 
</codes> 
<stuff> stuff </stuff> 
</x> 

而且我想改造它得到这个输出:

<out> 
<y> 
    <name>name1</name> 
    <code>code1</code> 
    <stuff> stuff </stuff> 
</y> 
<y> 
    <name>name2</name> 
    <code>code2</code> 
    <stuff> stuff </stuff> 
</y> 
</out> 

我不知道源文件中的名称和代码标签的数量,但我知道名称的数量等于代码的数量。

请分享一些提示,怎么做。

+0

好问题,+1。查看我的答案,获取完整而简短的解决方案。 :) – 2010-12-20 19:59:54

回答

2

这种转变

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <out> 
    <xsl:apply-templates select="names/name"/> 
    </out> 
</xsl:template> 

<xsl:template match="name"> 
    <xsl:variable name="vPos" select="position()"/> 
    <y> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select= 
    "../../codes/code[position()=$vPos]"/> 
    <xsl:copy-of select="/*/stuff"/> 
    </y> 
</xsl:template> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<x> 
    <names> 
     <name>name1</name> 
     <name>name2</name> 
    </names> 
    <codes> 
     <code>code1</code> 
     <code>code2</code> 
    </codes> 
    <stuff> stuff </stuff> 
</x> 

产生想要的,正确的结果

<out> 
    <y> 
     <name>name1</name> 
     <code>code1</code> 
     <stuff> stuff </stuff> 
    </y> 
    <y> 
     <name>name2</name> 
     <code>code2</code> 
     <stuff> stuff </stuff> 
    </y> 
</out> 
+0

完美的作品,谢谢。我明白将来如何做类似的转变。 – 2010-12-21 20:15:18

+0

@ukasz:不客气。 – 2010-12-21 20:28:32