在XSLT中选择的嵌套条件

时间:2014-07-31 12:27:49

标签: xml xslt xpath

我需要在XML中找到满足相当复杂条件的节点: 找到所有record个孩子datafield,其中属性tag的值为" 020"

以下是xml的摘录:

<record xmlns="http://www.loc.gov/MARC21/slim" type="Bibliographic">
    <leader>01201nam a2200349 c 4500</leader>
    <controlfield tag="008">100218s2009    be ||||| |||| 00||||dut  </controlfield>
    <datafield tag="015" ind1=" " ind2=" ">
      <subfield code="a">13,A50</subfield>
      <subfield code="2">dnb</subfield>
    </datafield>
    <datafield tag="016" ind1="7" ind2=" ">
      <subfield code="2">DE-101</subfield>
      <subfield code="a">1000318389</subfield>
    </datafield>
    <datafield tag="020" ind1=" " ind2=" ">
      <subfield code="a">9789044722369</subfield>
      <subfield code="c">kart.</subfield>
      <subfield code="9">978-90-447-2236-9</subfield>
    </datafield>
    ....
</record>

目前我对制定XPath以匹配这些记录绝望。我试过了

<xsl:template match="//x:record[/x:datafield[@x:tag='020']]">
    ...
</xsl>

但没有匹配的记录(x是元素的nmespace)。但最多

<xsl:template match="//x:record[/x:datafield]">
    ...
</xsl>

它有效(选择所有recorddatafield个孩子的{{1}}。 我做错了什么?是否不允许嵌套条件?

1 个答案:

答案 0 :(得分:4)

默认名称空间仅适用于元素节点,不适用于属性节点,因此您需要使用@tag而非@x:tag的属性。

并且匹配模式开头的//不是必需的。此外,x:datafield元素是子元素,因此请使用相对路径match="x:record[x:datafield[@tag = '020']]"