Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT转换删除具有指定属性的节点_Xml_Xslt_Transformation - Fatal编程技术网

Xml XSLT转换删除具有指定属性的节点

Xml XSLT转换删除具有指定属性的节点,xml,xslt,transformation,Xml,Xslt,Transformation,我在使用XLT解析XML文件时遇到问题 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl"> <body style="margin-top: 0px;"> <a name="top"/> <a name="menu"> </a> <a href="cool html"> </a> <table w

我在使用XLT解析XML文件时遇到问题

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
    <body style="margin-top: 0px;">
    <a name="top"/>
    <a name="menu"> </a>
    <a href="cool html"> </a>
    <table width="100%" cellspacing="0" cellpadding="2" border="0" class="aws_border sortable"/>
    </body>
    </html>

我需要删除带有
的所有节点,同时保留
节点和文档中的其他节点

我试过了

    <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:template match="body"> 
    <xsl:for-each select="a"> 
      <xsl:if test="@href != '' ">
     <xsl:copy-of select="."/> 
    </xsl:if>
         </xsl:for-each> 
    </xsl:template>
    </xsl:stylesheet>


但它只保留
节点,并删除所有其他节点。

保留所有节点并仅更改少数节点通常是这样的:

  • 您可以使用标识模板。它复制(“保留”)所有未以其他方式处理的节点
  • 为每个节点编写另一个模板,该模板应以不同方式处理
  • 您抵制使用
    的冲动。你不需要它
  • XSLT:

    
    
    就这样

    第三点实际上相当重要。避免在您编写的所有XSLT中使用
    。这看起来很熟悉,也很有帮助,但事实并非如此。它的使用往往会导致笨重、单一、嵌套很深的XSLT代码,很难重用


    始终尝试优先选择
    而不是

    保留所有节点并仅更改少数节点通常是这样的:

  • 您可以使用标识模板。它复制(“保留”)所有未以其他方式处理的节点
  • 为每个节点编写另一个模板,该模板应以不同方式处理
  • 您抵制使用
    的冲动。你不需要它
  • XSLT:

    
    
    就这样

    第三点实际上相当重要。避免在您编写的所有XSLT中使用
    。这看起来很熟悉,也很有帮助,但事实并非如此。它的使用往往会导致笨重、单一、嵌套很深的XSLT代码,很难重用


    总是尽量选择
    而不是

    谢谢你的回答,但它不起作用->它保留了所有节点。@托马斯你说得对,我忘记了你输入的XML名称空间。现在已修复。感谢您的回答,但它不起作用->它保留所有节点。@Tomasz您是对的,我忘记了输入中的XML名称空间。现在已修复。一些建议,除非真的需要,否则不要对每一个都使用!(例如:用于访问同级节点等)。。试着使用
    (就像Tomalak的答案一样)这可以让代码可读性和简单:)一些建议,除非真的需要,否则不要对每一个都使用!(例如:用于访问同级节点等)。。试着使用
    (就像Tomalak的回答一样)这样可以保持代码的可读性和简单性:)
    <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xhtml="http://www.w3.org/1999/xhtml"
    >
    
      <!-- the identity template -->    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
      </xsl:template>
    
      <!-- empty template to remove <a name="..."> specifically -->    
      <xsl:template match="xhtml:a[@name]" />
    
    </xsl:stylesheet>