XSLT null比较

时间:2011-07-03 09:50:46

标签: xslt

我有一个xml如下。

<attributes>
        <attribute>
            <attributeName>agenda-group</attributeName>
            <value>generic</value>
        </attribute>
        <attribute>
            <attributeName>auto-focus</attributeName>
            <value>true</value>
        </attribute>
        <attribute>
            <attributeName>no-loop</attributeName>
            <value>true</value>
        </attribute>
        <attribute>
            <attributeName>salience</attributeName>
            <value>73</value>
        </attribute>
    </attributes>

当我得到上面的块时,我需要复制上面的块,因为它在结果xml中。如果我得到下面的块没有值

   <attributes>
        <attribute>
            <attributeName></attributeName>
            <value></value>
        </attribute>

    </attributes>

         or
       <attributes/>

我需要在我的xml中省略这个块。我正在使用xslt进行翻译。 请提供一些指示以获得所需的输出。

4 个答案:

答案 0 :(得分:1)

使用identity template并添加以下模板:

<xsl:template match="attributes[not(attribute/value/text())]" />
<xsl:template match="attribute[not(value/text())]" />

这两个空模板捕获没有值的<attributes><attribute>元素,并且不会为它们生成输出,从而有效地删除它们。

答案 1 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "attributes[not(node())]
 |
  attribute[not(attributeName/text())]
 "/>
</xsl:stylesheet>

应用于此XML文档时(请注意最后的空<attributes>attribute/attributeName):

<attributes>
    <attribute>
        <attributeName>agenda-group</attributeName>
        <value>generic</value>
    </attribute>
    <attribute>
        <attributeName>auto-focus</attributeName>
        <value>true</value>
    </attribute>
    <attribute>
        <attributeName>no-loop</attributeName>
        <value>true</value>
    </attribute>
    <attribute>
        <attributeName>salience</attributeName>
        <value>73</value>
    </attribute>

    <attribute>
        <attributeName></attributeName>
        <value></value>
    </attribute>

    <attributes/>
</attributes>

生成想要的结果(忽略空元素 - 不复制):

<attributes>
  <attribute>
    <attributeName>agenda-group</attributeName>
    <value>generic</value>
  </attribute>
  <attribute>
    <attributeName>auto-focus</attributeName>
    <value>true</value>
  </attribute>
  <attribute>
    <attributeName>no-loop</attributeName>
    <value>true</value>
  </attribute>
  <attribute>
    <attributeName>salience</attributeName>
    <value>73</value>
  </attribute>
</attributes>

解释:标识规则(按原样复制每个节点)被一个模板覆盖,该模板与所需的“空”元素匹配且没有正文,因此它们只是简单的跳过/忽略。

答案 2 :(得分:0)

以下转换将通过省略:

复制输出中的任何attributes
  • empty attributes
  • attributes只有空attribute个孩子(或空子元素)
  • 任何空子attribute(或空子元素)

XSLT 1.0

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="attributes[not(*)]
     |
     attributes[count(*)=count(attribute[.=''])]
     | 
     attribute[.='']"/>

</xsl:stylesheet>

应用于以下输入时:

<root>
    <attributes>
        <attribute>
            <attributeName>agenda-group</attributeName>
            <value>generic</value>
        </attribute>
        <attribute/>
        <attribute>
            <attributeName></attributeName>
            <value></value>
        </attribute>
        <attribute>
            <attributeName>salience</attributeName>
            <value>73</value>
        </attribute>
    </attributes>
    <attributes>
        <attribute>
            <attributeName></attributeName>
            <value></value>
        </attribute>
    </attributes>
    <attributes/>
</root>

产生

<root>
   <attributes>
      <attribute>
         <attributeName>agenda-group</attributeName>
         <value>generic</value>
      </attribute>
      <attribute>
         <attributeName>salience</attributeName>
         <value>73</value>
      </attribute>
   </attributes>
</root>

答案 3 :(得分:-1)

试试这个:

<xsl:for-each select="//attributes[descendant::attribute]">
   some stuff
</xsl:for-each>