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

XSLT propagating Parent element into each child in a child list

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

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

<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 变成 rowvalue 以及前面的 key.

您将问题标记为 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>