我有一个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进行翻译。 请提供一些指示以获得所需的输出。
答案 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
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>