我有一些XML,我正在使用XSLT转换来构建链接。首先,我的模板匹配具有特定属性的节点,并存储该属性的值,该属性工作正常。然后我需要找到一个id属性与我刚刚存储的值匹配的节点。但是,当我尝试选择节点并提取id属性进行比较时,它正在选择我所定位的节点的所有子节点,即使我指定我只想要id属性。如何只选择id属性?
XML
<div>
<bibl id="label2212" n="M">
<date n="created">19401231</date>
<title level="m">test title 1</title>
<kw type="subject">Ⓑ ...</kw><!-- EXTRA -->
<kw type="subject">Ⓔ ...</kw><!-- EXTRA -->
<kw type="subject">Ⓖ Indonesia < Southeast Asia < Asia</kw><!-- EXTRA -->
<note type="comment">Linked reference: ABIA 13, 1938/658
<xref n="label658">label658</xref>
</note>
</bibl>
<bibl id="label658" n="M">
<date n="created">19401231</date>
<title level="m">test title 2</title>
<kw type="subject">Ⓑ ...</kw><!-- EXTRA -->
<kw type="subject">Ⓔ ...</kw><!-- EXTRA -->
<kw type="subject">Ⓖ Indonesia < Southeast Asia < Asia</kw><!-- EXTRA -->
</bibl>
XSLT
<xsl:template match="note[@type = 'comment' ]/xref[@n]">
<xsl:variable name="n-xref"><xsl:value-of select="@n"/></xsl:variable>
<xsl:variable name="test"><xsl:value-of select="../../../bibl[@id]"/></xsl:variable>
<a>
<xsl:attribute name="href" select="$test"></xsl:attribute>
</a>
</xsl:for-each>-->
<xsl:apply-templates/>
</xsl:template>enter code here
运行时,变量test包含bibl节点的所有子节点 我甚至尝试过select =“../../../ bibl [@ id = $ n-xref]”这两个都不起作用
答案 0 :(得分:0)
表达式bibl[@id]
选择具有@id属性的所有子bibl
元素。在您的示例中,所有bibl
元素都具有@id属性,因此您可以全部选择它们。我想您正在尝试选择其@id属性与$ n-xref的值匹配的那个。那将是bibl[@id=$n-xref]
。你说你试过了,它没有用;再试一次,如果它仍然不起作用,请告诉我们你做了什么。
仔细观察,我怀疑你的下一个问题是代码<xsl:attribute name="href" select="$test"/>
。 $test
的值是bibl
元素,而您需要其@id
属性。如上所述,您的属性将设置为bibl
元素的字符串值,即空格。
顺便提一下,为了清晰度和效果,您的代码<xsl:variable name="n-xref"><xsl:value-of select="@n"/></xsl:variable>
应该写为<xsl:variable name="n-xref" select="@n"/>
。