2010-09-02 106 views
1

我有一个XMLXSLT分组问题

<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总是循环?

+1

提示:当您要编辑一职,请按问题底部的“编辑”链接,不要使用浏览器的后退按钮。否则,你会再次重新发布相同的问题。这是你的原创:http://stackoverflow.com/questions/3623606/xslt-grouping-question – BalusC 2010-09-02 03:15:42

+0

我很惊讶所以没有抓住这个双重职位。 – deceze 2010-09-02 03:17:35

+0

@deceze它做到了。或者,相反,SO用来捕捉欺骗问题的机制确实如此。这是社区。 – Will 2010-09-02 11:24:31

回答

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> 
+0

如果您要硬编码元素和属性名称,为什么您不会使用文字结果元素和属性值模板作为DevNull答案?这是硬编码和详细的。 – 2010-09-03 14:49:53

0

你不应该有环......

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> 

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