xslt仅在指定属性时选择所有子节点

时间:2015-08-24 15:42:41

标签: xml xslt

我有一些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 &lt; Southeast Asia &lt; 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 &lt; Southeast Asia &lt; 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]”这两个都不起作用

1 个答案:

答案 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"/>

相关问题