2017-03-15 59 views
0

我使用下面的xslt删除命名空间。有没有办法修改这个以删除nil =“true”和空标签的元素(例如:<data/>)?XSLT - 删除nil = true&空元素

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:strip-space elements="*"/> 
    <xsl:template match="*"> 
     <xsl:element name="{local-name(.)}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name(.)}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 


</xsl:stylesheet> 

回答

0

这似乎不过工作,请建议,如果有这样做更有效的方式 -

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:strip-space elements="*" /> 


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

    <!-- TEMPLATE #2 --> 
    <xsl:template match="*[@xsi:nil = 'true']" /> 

    <xsl:template 
     match="*[not(@*|*|comment()|processing-instruction()) 
       and 
       normalize-space()='']" /> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name(.)}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name(.)}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 



</xsl:stylesheet> 
+1

我没有看到很大的提升空间,但有一点要注意:这将如果包含注释,属性和处理指令的元素包含'xsi:nil =“true”'属性,则移除它们。那是你要的吗? – JLRishe

+0

感谢@JLRishe突出显示潜在问题。截至目前,我正在使用的XML数据没有属性。 –

+1

此代码存在问题,因为模板规则不明确。一个元素可能匹配规则2和3(并且它们具有相同的优先级)。同样,属性将匹配规则1和规则5.元素匹配规则1和规则4,但这不是一个问题,因为规则4具有更高的优先级。如果有两个规则与具有相同优先级的节点相匹配,那么究竟发生了什么取决于您使用的是哪个版本的XSLT,而使用XSLT 1.0则取决于您使用的是哪个处理器。因此,通过指定优先级来保证不发生这种情况是最安全的。 –