是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>
答案 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>