输入:
<ROOT>
<TEMPLATE style="test">
<ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT></VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="test">
<ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE>
<ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT></VALUE></ATTRIBUTE>
<ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="something-else">
<ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="footnotes">
<ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE>
<ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE>
<ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE>
</TEMPLATE>
<ROOT>
所需输出:
<ROOT>
<TEMPLATE style="test">
<ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT> *1</VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="test">
<ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE>
<ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT> *2</VALUE></ATTRIBUTE>
<ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="something-else">
<ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE>
</TEMPLATE>
<TEMPLATE style="footnotes">
<ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE>
<ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE>
<ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE>
</TEMPLATE>
<ROOT>
在我的样式为“test”的模板中,有些属性的名称+前缀“FOOTNOTE_”可以与模板“footnotes”中的属性名称匹配。如果名称匹配,则应将 " * {position}" 添加到属性值中。该位置计算已设置的脚注数量,但顺序基于测试样式属性而不是脚注。
我已经尝试过各种分组尝试和 for-each 循环,但它们从未达到预期的结果。
我正在使用 XSLT 2.0
我可能会分两步完成 - 说这样的话:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="fn" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name, 'FOOTNOTE_')" />
<xsl:template match="/">
<xsl:variable name="temp">
<xsl:apply-templates mode="temp"/>
</xsl:variable>
<xsl:apply-templates select="$temp/ROOT"/>
</xsl:template>
<!-- identity transform -->
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE[key('fn', @name)]/VALUE" mode="temp">
<xsl:copy>
<xsl:apply-templates/>
<NUMBER/>
</xsl:copy>
</xsl:template>
<xsl:template match="NUMBER">
<xsl:text> *</xsl:text>
<xsl:number count="NUMBER" level="any"/>
</xsl:template>
</xsl:stylesheet>
请注意,结果是混合内容的 XML,这是您通常想要避免的。
试试这个:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:key name="footnote" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name,'FOOTNOTE_')"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE/VALUE">
<xsl:variable name="name" select="parent::*/@name"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:variable name="footnode" as="element()?" select="key('footnote',$name)"/>
<xsl:if test="$footnode">
<xsl:value-of select="concat(' *',(count(parent::*/preceding-sibling::*) + 1))"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>