要獲取每個元素的id,您需要回顧每個祖先,並且爲每個級別計算前面兄弟的數量。
<xsl:attribute name="id">
<xsl:apply-templates select="ancestor-or-self::*" mode="id"/>
</xsl:attribute>
<xsl:template match="*" mode="id">
<xsl:value-of select="count(preceding-sibling::*) + 1"/>
</xsl:template>
元素名稱轉換爲類屬性是直接的,和做像這樣:
<xsl:attribute name="class">
<xsl:value-of select="local-name()"/>
</xsl:attribute>
而且將文本轉換爲值屬性也相當簡單。
<xsl:template match="text()">
<xsl:attribute name="value">
<xsl:value-of select="normalize-space(.)"/>
</xsl:attribute>
</xsl:template>
的正常化空間這裏是去除示例XML顯示的換行符。
以下是完整的XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Match root element -->
<xsl:template match="/">
<tree>
<xsl:apply-templates select="node()"/>
</tree>
</xsl:template>
<!-- Match any element in the XML -->
<xsl:template match="*">
<item>
<xsl:attribute name="id">
<xsl:apply-templates select="ancestor-or-self::*" mode="id"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:value-of select="local-name()"/>
</xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</item>
</xsl:template>
<!-- Used to match ancestors to work out the id -->
<xsl:template match="*" mode="id">
<xsl:value-of select="count(preceding-sibling::*) + 1"/>
</xsl:template>
<!-- Convert text into the value attribute -->
<xsl:template match="text()">
<xsl:attribute name="value">
<xsl:value-of select="normalize-space(.)"/>
</xsl:attribute>
</xsl:template>
<!-- Copy any existing attributes in the XML -->
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
當示例XML應用,下面是輸出:
<tree>
<item id="1" class="element">
<item id="11" class="child_element">
<item id="111" class="grandchild_element" value="only one"/>
</item>
<item id="12" class="child_element">
<item id="121" class="grandchild_element" value="one"/>
<item id="122" class="grandchild_element" value="two"/>
</item>
</item>
</tree>