输出中“can”元素的数量应等于输入xml中“a”元素下“c”元素的出现次数。因此,“can”元素的第一次连续出现应该是3(因为在输入中a下的c elemet的第一次连续出现是3)并且根据输入,“can”元素的下一次连续出现应该是2。然而,在我当前的输出中它总共重复(5)。我认为下面的行应该改变,但不确定如何,尝试使用position()。这只是模板首先应用于c(使用count ../)a,然后是第二个a。
这条线,我相信应该改变
<xsl:apply-templates select="/*/*[$coun]/c"/>
我的输入xml
<Root>
<a>
<b>12</b>
<c>1</c>
<c>2</c>
<c>3</c>
</a>
<a>
<b>12</b>
<c>a</c>
<c>c</c>
</a>
</Root>
我的xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Root>
<xsl:apply-templates select="*/*/b"/>
</Root>
</xsl:template>
<xsl:template match="b">
<a>
<xsl:value-of select="../b"/>
</a>
<xsl:variable name="coun">
<xsl:value-of select="count(../preceding-sibling::a) + 1"/>
</xsl:variable>
<xsl:apply-templates select="/*/*[$coun]/c"/>
</xsl:template>
<xsl:template match="c">
<can>abc</can>
</xsl:template>
</xsl:stylesheet>
我当前的输出
<Root>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
</Root>
我的预期输出
<Root>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<a>12</a>
<can>abc</can>
<can>abc</can>
</Root>
答案 0 :(得分:4)
输入:
<Root>
<a>
<b>12</b>
<c>1</c>
<c>2</c>
<c>3</c>
</a>
<a>
<b>12</b>
<c>a</c>
<c>c</c>
</a>
</Root>
XSLT:
<xsl:template match='b'>
<a>
<xsl:value-of select='.'/>
</a>
</xsl:template>
<xsl:template match='c'>
<can>abc</can>
</xsl:template>
<xsl:template match='/Root'>
<Root>
<!-- select all 'b' and 'c' elements within an 'a' element -->
<xsl:apply-templates select='a/b | a/c'/>
</Root>
</xsl:template>
输出:
<Root>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<a>12</a>
<can>abc</can>
<can>abc</can>
</Root>