在我的input.xml
中,我有<note>
和<bignote>
标记,因此在输出中,我试图使这两个标记的每次出现都遵循相同的编号链。
<body>
<p>
dumy text dumy text dumy text dumy text
<div>
dumy text dumy text dumy text dumy text
<note>LOREM</note>
dumy text dumy text dumy text dumy text
</div>
<gibnote>IPSUM</gibnote>
</p>
<p>
dumy text dumy text dumy text dumy text
<note>DOLOR</note>
dumy text dumy text dumy text dumy text
</p>
dumy text dumy text dumy text dumy text
<bignote>SIT</bignote>
<div>
<note>AMET</note>
</div>
dumy text dumy text dumy text dumy text
</body>
<编辑>stylesheet.xslt编辑><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="note">
<xsl:copy>
<xsl:number level="any" format="1. "/>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="bignote">
<xsl:copy>
<xsl:number level="any" format="1. "/>
<xsl:value-of select="."/>
</xsl:copy>
BIG
</xsl:template>
</xsl:stylesheet>
output.xml应该是
<body>
<p>
dumy text dumy text dumy text dumy text
<div>
dumy text dumy text dumy text dumy text
<note rank="note1">1. LOREM</note>
dumy text dumy text dumy text dumy text
</div>
<note rank="note2">2. BIGIPSUM</note>
</p>
<p>
dumy text dumy text dumy text dumy text
<note rank="note3">3. DOLOR</note>
dumy text dumy text dumy text dumy text
</p>
dumy text dumy text dumy text dumy text
<note rank="note4">4. BIGSIT</note>
<div>
<note rank="note5">5. AMET</note>
</div>
dumy text dumy text dumy text dumy text
</body>
不幸的是,编号遵循<note>
s和<bignote>
s之间的不同链。
1. note Lorem
1. bignote Ipsum
2. note Dolor
2. bignote sit
3. note amet
那么,如何使<note>
s和<bignote>
s遵循相同的编号套件呢?
查看xsl:number
的count
属性。这是一个模式,它定义了哪些节点被计算来计算数字。
XSLT 1.0规范的"编号"部分说:
count
属性是指定节点应该是什么的模式在这些水平上计算。如果未指定count属性,则为默认为匹配具有相同节点类型的任何节点的模式作为当前节点,如果当前节点有扩展名称,使用与当前节点相同的扩展名称。
这里我修改了你的样式表,使它计数note
或bignote
元素。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="note">
<xsl:copy>
<xsl:number count="bignote|note" level="any" format="1. "/>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="bignote">
<xsl:copy>
<xsl:number count="bignote|note" level="any" format="1. "/>
<xsl:value-of select="."/>
</xsl:copy>
BIG
</xsl:template>
</xsl:stylesheet>
如果您想这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="note | bignote">
<xsl:variable name="num">
<xsl:number count="note | bignote" level="any"/>
</xsl:variable>
<note rank="note{$num}">
<xsl:value-of select="format-number($num, '0. ')"/>
<xsl:if test="self::bignote">BIG</xsl:if>
<xsl:value-of select="."/>
</note>
</xsl:template>
</xsl:stylesheet>