使用XSLT过滤XML元素

时间:2014-04-08 06:20:07

标签: xslt

假设我有以下XML输入文件:

<root> 
  <NodeX> 
      ... 
  </NodeX>  
  <NodeY> 
      ... 
  </NodeY>  
  <Description>
      <section01>
         <subsection key="KeyA">Some text</subsection>
         <subsection key="KeyB">Some text</subsection>
      </section1>

      <section02>
         <subsection key="KeyC">Some text</subsection>
      </section2>

      <section03>
         <subsection key="KeyD">Some Text</subsection>
      </section3>

   </Description>  
   ...
</root>

另一个带有&#34;规则&#34;的XML文件其中子部分的键与受众属性一起列出。

示例摘录:

<rules>
    <subsection id="01">
        <key audience="internalOnly">KeyA</key>
        <key audience="internalOnly">KeyB</key>
    </subsection>

    <subsection id="02">
        <key>KeyC</key>
    </subsection>
<rules>

我尝试编写一个XSL转换,根据规则XML文件中的audience属性值从输入XML文件中删除子部分。如果值为&#34; internalOnly&#34;该部分必须删除。

在示例中,应该产生以下输出XML:

<root> 
  <NodeX> 
      ... 
  </NodeX>  
  <NodeY> 
      ... 
  </NodeY>  
  <Description>
      <section02>
         <subsection key="KeyC">Some text</subsection>
      </section2>

      <section03>
         <subsection key="KeyD">Some Text</subsection>
      </section3>

   </Description>  
   ...
</root>

(整个section01被删除,因为两个小节都是&#34; internalOnly&#34;)。

问题是1)&#34;查找&#34;在规则XML文件中; 2)如果删除了所有相应的子部分,则删除部分元素:

如果观众属性将包含在输入XML文件中,我将根据要求创建以下XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="subsection[@audience='internalOnly']"></xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

我不认为这与您的previous question之间存在很大差异。如果要从rules.xml文档中排除某些键,请从以下位置更改keys变量的定义:

<xsl:variable name="keys" select="key" />

为:

<xsl:variable name="keys" select="key[not(@audience='internalOnly')]" />

其他一切都可以保持不变。


  

了解XSLT键功能的用法存在问题

这是非常值得的。