0

下面是输入。在 Loop-1,2,3 元素是无界的。如果我们在转换中使用每个循环,我们将得到像 AA、BB、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>
4

1 回答 1

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>

另一种选择是使用身份转换

<?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>

身份转换的优点是,如果/当您确实想要自定义输出并转换任何内容时,您可以简单地添加一个模板来匹配该节点或属性来处理该特殊情况。

例如,如果你想为 second 产生不同的输出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>
于 2013-03-31T14:37:52.390 回答