我有一个xml
<Root>
<Parent>
<Child1><Node1>AAA</Node1><Node2>BBB</Node2></Child1>
<Child2><NodeX>XXX</NodeX><NodeY>YYY</NodeY></Child2>
<Child1><Node1>EEE</Node1><Node2>FFF</Node2></Child1>
<Child2><NodeX>GGG</NodeX><NodeY>HHH</NodeY></Child2>
<OtherChild></OtherChild>
</Parent>
</Root>
Child2将始终与child1一起使用。我需要知道如何使用xsl:foreach循环并创建XML输出示例。我可能有其他节点,如<OtherChild>
,但我担心
只是Child1和Chid2节点
<TransformedXML>
<Child attributefromNode1="AAA" attributefromNode2="BBB" attributefromNodeX="XXX" attributeFromNodeY="YYY"/>
<Child attributefromnode1="EEE" attributefromNode2="FFF" attributefromNodeX="GGG" attributeFromNodeY="HHH"/>
</TransformedXML>
我的问题是我如何在XSLT中循环,考虑到Child2节点将始终跟随Child1?
答案 0 :(得分:0)
我这样的事情可以解决问题:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output
method="xml"
indent="yes" />
<xsl:template match="/">
<xsl:for-each select="Root/Parent/Child1">
<Child>
<xsl:attribute name="attributefromNode1">
<xsl:value-of select="Node1" />
</xsl:attribute>
<xsl:attribute name="attributefromNode2" >
<xsl:value-of select="Node2" />
</xsl:attribute>
<xsl:attribute name="attributefromNodeX">
<xsl:value-of select="following-sibling::Child2/NodeX" />
</xsl:attribute>
<xsl:attribute name="attributefromNodeY">
<xsl:value-of select="following-sibling::Child2/NodeY" />
</xsl:attribute>
</Child>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
你不应该循环......
XML INPUT
<Root>
<Parent>
<Child1><Node1>AAA</Node1><Node2>BBB</Node2></Child1>
<Child2><NodeX>XXX</NodeX><NodeY>YYY</NodeY></Child2>
<Child1><Node1>EEE</Node1><Node2>FFF</Node2></Child1>
<Child2><NodeX>GGG</NodeX><NodeY>HHH</NodeY></Child2>
<OtherChild></OtherChild>
</Parent>
</Root>
<强> XSL 强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:apply-templates select="node()|@*"/>
</xsl:template>
<xsl:template match="/">
<TransformedXML>
<xsl:apply-templates/>
</TransformedXML>
</xsl:template>
<xsl:template match="Child1">
<Child attributefromNode1="{Node1}"
attributefromNode2="{Node2}"
attributefromNodeX="{following-sibling::Child2[1]/NodeX}"
attributefromNodeY="{following-sibling::Child2[1]/NodeY}"/>
</xsl:template>
</xsl:stylesheet>
XML OUTPUT
<?xml version="1.0" encoding="UTF-8"?>
<TransformedXML>
<Child attributefromNode1="AAA" attributefromNode2="BBB" attributefromNodeX="XXX"
attributefromNodeY="YYY"/>
<Child attributefromNode1="EEE" attributefromNode2="FFF" attributefromNodeX="GGG"
attributefromNodeY="HHH"/>
</TransformedXML>
答案 2 :(得分:0)
这是(几乎和以前一样)一个简短的解决方案:
<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><Node1>AAA</Node1><Node2>BBB</Node2></Child1>
<Child2><NodeX>XXX</NodeX><NodeY>YYY</NodeY></Child2>
<Child1><Node1>EEE</Node1><Node2>FFF</Node2></Child1>
<Child2><NodeX>GGG</NodeX><NodeY>HHH</NodeY></Child2>
<OtherChild></OtherChild>
</Parent>
</Root>
产生了想要的正确结果:
<TransformedXML>
<Child attribute1="AAA" attribute2="BBB" attribute3="XXX" attribute4="YYY"/>
<Child attribute1="EEE" attribute2="FFF" attribute3="GGG" attribute4="HHH"/>
</TransformedXML>
答案 3 :(得分:0)
这个XSLT 2.0样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="Parent">
<TransformedXML>
<xsl:apply-templates select="Child1"/>
</TransformedXML>
</xsl:template>
<xsl:template match="Child1">
<Child>
<xsl:apply-templates select="*|following-sibling::Child2[1]/*"/>
</Child>
</xsl:template>
<xsl:template match="Child1/*|Child2/*">
<xsl:attribute name="attributefrom{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
输出:
<TransformedXML>
<Child attributefromNode1="AAA" attributefromNode2="BBB" attributefromNodeX="XXX" attributefromNodeY="YYY"/>
<Child attributefromNode1="EEE" attributefromNode2="FFF" attributefromNodeX="GGG" attributefromNodeY="HHH"/>
</TransformedXML>