使用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>
非常感谢。
这类事情的标准方法是使用模板
<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)。