xslt变换,它根据多个后代中的负值选择元素

时间:2012-04-19 22:37:46

标签: xslt-2.0

我有以下基本的xml,只有在没有DB值= DB1的情况下才能解析NAME。

<rnas>
  <rna ID="1">
    <NAME>Segment 6</NAME>
    <XREF>
      <ID>AF389120</ID>
      <DB>DB1</DB>
    </XREF>
    <XREF>
      <ID>ABCDE</ID>
      <DB>DB2</DB>
    </XREF>
  </rna>
  <rna ID="10">
    <NAME>Segment 3</NAME>
    <XREF>
      <ID>12345</ID>
      <DB>DB2</DB>
    </XREF>
    <XREF>
      <ID>66789</ID>
      <DB>DB3</DB>
    </XREF>
  </rna>
</rnas>

预期输出为:

<rnas>
  <rna ID="10">
    <NAME>Segment 3</NAME>
  </rna>
<rnas>

我仍然是一个相对新手,并尝试过使用XSLT 2.0的各种方法,但到目前为止还没有能够正常工作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这将做你想要的事情

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.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="rna[.//DB/text()='DB1']"/>
  <xsl:template match="XREF"/>

</xsl:stylesheet>

这是一个身份变换以及两个空模板。第一个匹配包含文本值为rna的{​​{1}}的任何DB,并对其进行抑制。第二个匹配您不想输出的所有DB1元素。