XSLT获取元素在特定元素之间的第n个位置



在我的input.xml中,我有<note><bignote>标记,因此在输出中,我试图使这两个标记的每次出现都遵循相同的编号链。

<编辑>input.xml

<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:numbercount属性。这是一个模式,它定义了哪些节点被计算来计算数字。

XSLT 1.0规范的"编号"部分说:

count属性是指定节点应该是什么的模式在这些水平上计算。如果未指定count属性,则为默认为匹配具有相同节点类型的任何节点的模式作为当前节点,如果当前节点有扩展名称,使用与当前节点相同的扩展名称。

这里我修改了你的样式表,使它计数notebignote元素。

<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>

最新更新