我有一個表模式,它具有一些元字段數據,我需要將其拉低到行級別。使用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