1

我有一个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?

4

4 回答 4

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>
于 2010-09-02T03:51:29.800 回答
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 输出

<?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>
于 2010-09-02T04:34:04.970 回答
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>
于 2010-09-02T12:45:18.507 回答
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>
于 2010-09-02T13:47:13.900 回答