0

使用 XLST 1.0,我需要使用“过滤掉我”或“也过滤掉我”来检索没有bb元素的aa元素。

<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>

非常感谢。

4

1 回答 1

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)。

于 2013-07-16T14:36:39.767 回答