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
变成 row
和 value
以及前面的 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>
我是 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
变成 row
和 value
以及前面的 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>