使用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>
非常感谢。
答案 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)。