我有一个xml
<Root>
<Parent>
<Child1>A</Child1>
<Child2>B</Child2>
<Child1>X</Child1>
<Child2>Y</Child2>
</Parent>
</Root>
Child2将始终与child1一起使用。我需要知道如何使用xsl:foreach
循环并创建XML输出示例。
<TransformedXML>
<Child attribute1="A" attribute2="B"/>
<Child attribute1="X" attribute2="Y"/>
</TransformedXML>
我的问题是我如何在XSLT中循环,考虑到Child2节点将始终跟随Child1?
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFollowingChild1" match="*[not(self::Child1)]"
use="generate-id(preceding-sibling::Child1[1])"/>
<xsl:template match="Parent">
<TransformedXML>
<xsl:apply-templates/>
</TransformedXML>
</xsl:template>
<xsl:template match="Child1">
<Child>
<xsl:for-each select=".|key('kFollowingChild1', generate-id())">
<xsl:attribute name="attribute{position()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</Child>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的(经过多次校正以形成格式良好的!)XML文档:
<Root>
<Parent>
<Child1>A</Child1>
<Child2>B</Child2>
<Child1>X</Child1>
<Child2>Y</Child2>
</Parent>
</Root>
生成想要的正确结果:
<TransformedXML>
<Child attribute1="A" attribute2="B"/>
<Child attribute1="X" attribute2="Y"/>
</TransformedXML>
答案 1 :(得分:0)
您是否有特定原因要使用xsl:for-each
?我建议只使用匹配的模板:
<xsl:template match="Child1">
<Child attribute1="{.}" attribute2="{following-sibling::*[1]}"/>
</xsl:template>
<xsl:template match="Child2"/>
只要Child1
始终是Child2
之后的第一个兄弟姐妹的先决条件,这样就可以正常工作。