输入XML就像,
<link idref="c001_r1" target="page">1</link>
<link idref="r164">2004</link>
<link idref="ref1">Austen et al. 1975</link>
输出应该是,
<link idref="c001_r1" target="literature"><sup>1</sup></link>
<link idref="r164" target="literature">2004</link>
<link idref="ref1" target="literature">Austen et al. 1975</link>
我们写了xslt,如下所示。
<xsl:template match="link">
<xsl:choose>
<xsl:when test="starts-with(@idref, 'r') and string-length(.) = 4">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="target">
<xsl:value-of select="'literature'" />
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:when>
<xsl:when test="starts-with(@idref, 'ref') and string-length(.) > 4">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="target">
<xsl:value-of select="'literature'" />
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:when>
<xsl:when test="contains(@idref, '(.+)_r')">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="target">
<xsl:value-of select="'literature'" />
</xsl:attribute>
<sup>
<xsl:apply-templates select="node()"/></sup>
</xsl:copy>
</xsl:when>
<xsl:when test="starts-with(@idref, 'ref') and string-length(.) < 3">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="target">
<xsl:value-of select="'literature'" />
</xsl:attribute>
<sup>
<xsl:apply-templates select="node()"/>
</sup>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="target"><xsl:text>page</xsl:text>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
使用上面的xslt时,第3和第4个条件不起作用。我们需要根据属性值和字符串长度添加属性。我们无法提及小于(&lt;)符号来计算刺痛长度。
答案 0 :(得分:1)
你应该真正提到你得到的任何错误,而不是说“它不起作用”。对于<
符号,您可能会遇到“属性值”测试“与元素类型”xsl相关的错误:当“不得包含'&lt;'时字符。“
xsl:when
的语法应为此
<xsl:when test="starts-with(@idref, 'ref') and string-length(.) < 3">
或者更好的是,如果您使用的是XSLT 2.0或更高版本
<xsl:when test="starts-with(@idref, 'ref') and string-length(.) lt 3">
对于其他条件,您正在使用contains
,但这不支持正则表达式。它只是检查一个字符串是否是另一个字符串的子字符串。您需要在此使用matches
<xsl:when test="matches(@idref, '.+_r.+')">
这需要XSLT 2.0或更高版本。
请注意,您有很多重复的代码。尝试将其简化为此,例如......
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="(starts-with(@idref, 'r') and string-length(.) = 4)
or (starts-with(@idref, 'ref') and string-length(.) > 4)
or (matches(@idref, '.+_r.+'))
or (starts-with(@idref, 'ref') and string-length(.) lt 3)">
<xsl:attribute name="target" select="'literature'" />
</xsl:if>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>