获取父元素,其中不存在具有特定值的子元素

时间:2013-07-16 14:11:36

标签: xml xslt-1.0

使用XLST 1.0我需要检索 aa 元素,其中没有 bb 元素,其中“过滤掉我” 或者'过滤掉我'。

<data>
    <aa>
        <bb>Filter me out</bb>
        <bb>Some information</bb>
    </aa>
    <aa>
        <bb>And filter me out too</bb>
        <bb>Some more information</bb>
    </aa>
    <aa>
        <bb>But, I need this information</bb>
        <bb>And I need this information</bb>
    </aa>
</data>

一旦我有了正确的 aa 元素,我将输出每个 bb 元素,如下所示:

<notes>
    <note>But, I need this information</note>
    <note>And I need this information</note>
</notes>

非常感谢。

1 个答案:

答案 0 :(得分:2)

此类事情的标准方法是使用模板

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- copy everything as-is from input to output unless I say otherwise -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- rename aa to notes -->
  <xsl:template match="aa">
    <notes><xsl:apply-templates select="@*|node()" /></notes>
  </xsl:template>

  <!-- and bb to note -->
  <xsl:template match="bb">
    <note><xsl:apply-templates select="@*|node()" /></note>
  </xsl:template>

  <!-- and filter out certain aa elements -->
  <xsl:template match="aa[bb = 'Filter me out']" />
  <xsl:template match="aa[bb = 'And filter me out too']" />
</xsl:stylesheet>

最后两个模板与想要的特定aa元素相匹配,然后什么也不做。与特定过滤模板不匹配的任何aa元素都会与不太具体的<xsl:template match="aa">匹配,并重命名为notes

没有特定模板的任何内容都将被第一个“身份”模板捕获并复制到输出中不变。这包括包裹所有aa元素的父元素(您在示例中未提供但必须存在但输入不是格式良好的XML)。