我在大型(TEI 风格)XML 文件(约 6000 行)(在 OS X 上使用 Saxon-HE 9.5.1.6J)的较大(420 行)XSL 转换上收到此模棱两可的匹配警告。我想了解(并修复)警告。
Recoverable error
XTRE0540: Ambiguous rule match for /TEI/text[1]/group[1]/text[1]/body[1]/lg[33]/head[2]
Matches both "tei:lg[@type='poem']/tei:head" on line 103 of
file: hs2latex.xsl
and "*[@rend='italics']" on line 110 of
file: hs2latex.xsl
XML 看起来像:
<lg type='poem'>
<head rend='italics'>Sonnet 3<head>
...
</lg>
冲突的 XSL 规则看起来像这样:
<xsl:template match="tei:lg[@type='poem']/tei:head">
...
<xsl:apply-templates />
</xsl:template>
和
<xsl:template match="*[@rend='italics']"><!-- blah blah --></xsl:template>
由于属性只是另一个节点,我想我可以单独匹配它。但是,如果我的匹配项中只有一个属性,则会出现错误,因此我将 used 加到星号以匹配具有 rend='italics' 属性的所有节点,这会产生上面引用的模棱两可的错误。
是否可以做我在这里尝试的事情,即使用一个模板来匹配基于值的属性(无论元素的类型如何)?我有兴趣让一个模板处理任何具有例如“@rend='italics'”属性的元素。
我试图用一个最小的工作示例来重现这个问题,但提出了一个稍微不同的示例(这可能正是我所误解的)。
最小的工作 XML
<?xml version="1.0" encoding="utf-8"?>
<document>
<book>
<title>"One Title"</title>
</book>
<book>
<title rend="italics">Another Title</title>
</book>
</document>
和最小 XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*[@rend='italics']">
<italics><xsl:apply-templates /></italics>
</xsl:template>
<xsl:template match="title">
<title><xsl:apply-templates /></title>
</xsl:template>
</xsl:stylesheet>
这个最小的示例(我认为它会产生与我上面描述的相同的情况)不会产生模棱两可的匹配错误,而是会导致以下输出:
<title>"One Title"</title>
<italics>Another Title</italics>
我想要的(在这个最小的例子中)是:
<title>"One Title"</title>
<title><italics>Another Title</italics></title>
我怀疑我误解了有关 XSLT 或 XPath 的一些基本知识,但我现在不知所措,希望得到任何指导。非常感谢。