XSLT将父元素传播到子列表中的每个子节点

时间:2015-09-07 16:48:52

标签: xslt-2.0

是XSLT的新手,我只是无法绕过这个。 我有一个XML如下:

<root>
  <key>1</key>
  <list>
        <value>1</value>
        <value>2</value>
  </list>
</root>

我想要实现的目标是:

<root>
    <row>   
        <key>1</key>
         <value>1</value>
    </row>
    <row>   
        <key>1</key>
        <value>2</value>
   </row>         
</root>

1 个答案:

答案 0 :(得分:1)

您的要求并不完全清楚,但让我们试一试:

<xsl:template match="/root">
    <xsl:copy>
        <!-- each first following sibling after <key> -->
        <xsl:apply-templates select="key/following-sibling::list[1]" />
    </xsl:copy>
</xsl:template>

<xsl:template match="list">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="value">
    <row>
        <!-- the key immediately before the current <list> -->
        <xsl:copy-of select="ancestor::list/preceding-sibling::key[1]" />
        <xsl:copy-of select="." />
    </row>
</xsl:template>

此代码假定您对XSLT有基本的了解。它假设我理解list元素之前直接有key元素,并且每个row/value变为row,其中value和前一个key {1}}。

您标记了XSLT 2.0的问题,但此代码适用于XSLT 1.0或2.0(如果您尝试使用2.0功能,则在此特定情况下不会有很大差异。)

针对以下修改后的输入使用1.0(.NET)和两个2.0(Exselt和Saxon)处理器进行测试:

<root>
  <key>1</key>
  <list>
        <value>1</value>
        <value>2</value>
  </list>
  <key>2</key>
  <list>
        <value>55</value>
        <value>66</value>
        <value>77</value>
  </list>
</root>

导致以下输出:

<root>
   <row>
      <key>1</key>
      <value>1</value>
   </row>
   <row>
      <key>1</key>
      <value>2</value>
   </row>
   <row>
      <key>2</key>
      <value>55</value>
   </row>
   <row>
      <key>2</key>
      <value>66</value>
   </row>
   <row>
      <key>2</key>
      <value>77</value>
   </row>
</root>