Xml 每个问题的XSLT
我有一个xmlXml 每个问题的XSLT,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个xml <Root> <Parent> <Child1>A</Child1> <Child2>B</Child2> <Child1>X</Child1> <Child2>Y</Child2> </Parent> </Root> 我的问题是,考虑到Child2节点将始终跟随Child1,如何在XSLT中循环
<Root>
<Parent>
<Child1>A</Child1>
<Child2>B</Child2>
<Child1>X</Child1>
<Child2>Y</Child2>
</Parent>
</Root>
我的问题是,考虑到Child2节点将始终跟随Child1,如何在XSLT中循环?此转换:
<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>
<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>
应用于提供的XML文档时(经过多次更正,格式正确):
<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>
<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>
A.
B
X
Y
生成所需的正确结果:
<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>
<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>
此转换:
<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>
<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>
应用于提供的XML文档时(经过多次更正,格式正确):
<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>
<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>
A.
B
X
Y
生成所需的正确结果:
<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>
<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>
是否有一个特定的原因使您不想为每个使用xsl:for?我建议只使用匹配的模板:
<xsl:template match="Child1">
<Child attribute1="{.}" attribute2="{following-sibling::*[1]}"/>
</xsl:template>
<xsl:template match="Child2"/>
只要前提条件是Child1
始终是Child2
的第一个兄弟姐妹,这就可以正常工作xsl:for each
是否有具体原因不使用xsl:for each
?我建议只使用匹配的模板:
<xsl:template match="Child1">
<Child attribute1="{.}" attribute2="{following-sibling::*[1]}"/>
</xsl:template>
<xsl:template match="Child2"/>
只要Child1
始终是Child2
好问题(+1)的第一个兄弟姐妹这一先决条件就行了。请参阅我的答案,以获得简短而有效的解决方案。好问题(+1)。请参阅我的答案,以获得简短而有效的解决方案。谢谢。另外,如果myChild是1bxy,我如何通过Child1循环使用上述XSLT使其变小呢。我不明白为什么我会得到里面的文字。@Greens:我不明白--请你描述得更好一些。您希望得到什么结果(请使用XML)?输入1 B X Y-------------------------------------------输出这与您在问题中提出的问题有很大不同。请用你的新要求提出一个新问题。在发布新问题之前好好想想,否则你可能会再次错过一些重要的事情。例如,在新的所需输出中,不清楚anyName
的含义以及它与源XML的关系。谢谢。另外,如果myChild是1bxy,我如何通过Child1循环使用上述XSLT使其变小呢。我不明白为什么我会得到里面的文字。@Greens:我不明白--请你描述得更好一些。您希望得到什么结果(请使用XML)?输入1 B X Y-------------------------------------------输出这与您在问题中提出的问题有很大不同。请用你的新要求提出一个新问题。在发布新问题之前好好想想,否则你可能会再次错过一些重要的事情。例如,在新的所需输出中,不清楚anyName
的含义以及它与源XML的关系。