XSLT,将先前的数据附加到for-each的下一次迭代

时间:2011-07-05 15:10:55

标签: xml xslt xsd

我需要一个特定的XSLT解决方案,而且我一直在努力弄清楚如何让它工作。现在我的XML结构如下

<DataX>
   <DataY>
       <fieldy>A</fieldy>
       <fieldx>B</fieldx>
       <Data1>
           <field1>1</field1>
           <field2>2</field2>
       </Data1>
       <Data2>
           <field3>3</field3>
           <field4>4</field4>
       </Data2>
       <Data3>
           <field5>5</field5>
           <field6>6</field6>
       </Data3>
   </DataY>
</DataX>

我需要做的是将<DataY> <field1> <field2>的内容附加到内部数据字段的每个实例。不改变原始XML

喜欢这个

A B 1 2    A B 3 4    A B 5 6

就像这样,我为了清晰起见添加了空格。

我尝试了一些内心的每个陈述和其他一些事情。我没有体验过XSLT,但也许我在想它。我只是不确定如果使用for-each进行传递后如何获得A B数据。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vPrefix">
  <xsl:for-each select="/*/DataY/*[not(starts-with(name(),'Data'))]">
    <xsl:value-of select="."/>
  </xsl:for-each>
 </xsl:variable>

 <xsl:template match="/*/*/*[starts-with(name(),'Data')]">
  <xsl:value-of select="concat($vPrefix, .)"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档

<DataX>
    <DataY>
        <fieldy>A</fieldy>
        <fieldx>B</fieldx>
        <Data1>
            <field1>1</field1>
            <field2>2</field2>
        </Data1>
        <Data2>
            <field3>3</field3>
            <field4>4</field4>
        </Data2>
        <Data3>
            <field5>5</field5>
            <field6>6</field6>
        </Data3>
    </DataY>
</DataX>

产生想要的,正确的结果(没有插入空格,因为它们是在“为了清晰”的问题中添加的):

AB12AB34AB56

答案 1 :(得分:2)

您应该开始使用此转换。


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*/*">
        <xsl:apply-templates select="*[2]/following-sibling::*" mode="data"/>
    </xsl:template>

    <xsl:template match="*" mode="data">
        <xsl:value-of select="concat(../*[1],../*[2],*[1],*[2])"/>
    </xsl:template>

</xsl:stylesheet>

应用于此输入时:

<DataX>
   <DataY>
       <fieldx>A</fieldx>
       <fieldy>B</fieldy>
       <Data1>
           <field1>1</field1>
           <field2>2</field2>
       </Data1>
       <Data2>
           <field3>3</field3>
           <field4>4</field4>
       </Data2>
       <Data3>
           <field5>5</field5>
           <field6>6</field6>
       </Data3>
   </DataY>
</DataX>

它产生:

AB12AB34AB56