我有一个表模式,它具有一些元字段数据,我需要将其拉低到行级别。使用xsl:key检索同级:
所以这...
<tables>
<table name="T01">
<columns>
<column name="F01">
<heading>Field 1</heading>
</column >
<column name="F02">
<heading>Field 2</heading>
</column>
</columns>
<rows>
<row>
<field name="F01">AAAAA</field>
<field name="F02">BBBBB</field>
</row>
<row>
<field name="F01">DDDDD</field>
<field name="F02">EEEEE</field>
</row>
</rows>
</table>
<table name="T02">
<!-- ... -->
</table>
</tables>
应该成为这个...
<tables>
<table name="T01">
<rows>
<row>
<field name="F01">
<heading>Field 1</heading>
<value>AAAAA</value>
</field>
<field name="F02">
<heading>Field 2</heading>
<value>BBBBB</value>
</field>
</row>
<row>
<field name="F01">
<heading>Field 1</heading>
<value>DDDDD</value>
</field>
<field name="F02">
<heading>Field 2</heading>
<value>EEEEE</value>
</field>
</row>
</rows>
</table>
<table name="T02">
<!-- ... -->
</table>
</tables>
我相信有吨简单的方式与XSLT要做到这一点,但由于我的工具,我真的需要通过一个键()来检索列标题。因此,像这样......
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- This won't work but if it did ... -->
<xsl:key name="field-heading"
match="../../columns/column/heading"
use="../@name" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field">
<field name="{@name}">
<heading>
<xsl:value-of select="key('field-heading', @name)"/>
</heading>
<value>
<xsl:value-of select="."/>
</value>
</field>
</xsl:template>
<xsl:template match="columns"/>
</xsl:stylesheet>
但是在xsl:钥匙匹配属性不允许父轴,我不知道是否有任何其他方式使其适合。
查看我对DevNull的评论,并感谢更正。 – 2012-03-13 21:57:44