以下是输入。在Loop-1,2,3元素是无界的。如果我们在转换中使用每个循环,我们将得到输出,如A A,B B,C C.但我希望输出与输入相同。
请参阅以下输出。
输入:
<LOOP-1><!-- unbounded -->
<element1>A</element1>
<LOOP-1>
<LOOP-2><!-- unbounded -->
<element2>B</element2>
<LOOP-2>
<LOOP-3><!-- unbounded -->
<element3>C</element3>
<LOOP-3>
<LOOP-1>
<element1> A</element1>
<LOOP-1>
<LOOP-2>
<element2>B</element2>
<LOOP-2>
<LOOP-3>
<element3>C</element3>
<LOOP-3>
对于上面的输入,如果我们为每个输入我们将得到输出就像
A
A
B
B
C
C
但是我想要下面的输出。我们可以实现这一点。解决方案应该是通用的。感谢您的帮助。
输出
<LOOP-1>
<element1>A</element1>
<LOOP-1>
<LOOP-2>
<element2>B</element2>
<LOOP-2>
<LOOP-3>
<element3>C</element3>
<LOOP-3>
<LOOP-1>
<element1> A</element1>
<LOOP-1>
<LOOP-2>
<element2>B</element2>
<LOOP-2>
<LOOP-3>
<element3>C</element3>
<LOOP-3>
XSLT:
<xsl:for-each select="LOOP-1">
<xsl:element1>
<xsl:value-of select="element1"/>
</xsl:element1>
</xsl:for-each>
<xsl:for-each select="LOOP-2">
<xsl:element2>
<xsl:value-of select="element2"/>
</xsl:element2>
</xsl:for-each>
<xsl:for-each select="LOOP-3">
<xsl:element3>
<xsl:value-of select="element3"/>
</xsl:element3>
</xsl:for-each>
答案 0 :(得分:0)
<xsl:for-each>
不是必需的,在这种情况下会使事情变得更加复杂和困难。
如果您只想在输出中生成源XML的精确副本,则可以使用<xsl:copy-of>
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
另一种选择是使用identity transform:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
标识转换的优点是,如果/当您想要自定义输出并转换任何内容时,您只需添加模板以匹配该节点或属性即可处理该特殊情况。
例如,如果您想为第二个B
生成不同的输出,则可以添加此模板:
<xsl:template match="LOOP-2[2]/element2[.='B']">
<xsl:copy>
<xsl:text>This is a special case for the second LOOP-2/element2 who's text() equals 'B'</xsl:text>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>