Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 XSL-删除空标记并保留空格_Xml_Xslt - Fatal编程技术网

Xml XSL-删除空标记并保留空格

Xml XSL-删除空标记并保留空格,xml,xslt,Xml,Xslt,我需要删除空节点,但保留带有空格的节点作为特定属性“delete”的值。我不太熟悉XSL…如何删除空值,但保留空格值 这最好仅适用于操作为“DELETE”的节点。例如,当操作为“DELETE”时,无论其他节点名称是什么(因为它们会更改),都应该删除空值的子节点。如果这是不可能的,我将满足于从整个XML文件中删除空值,下面列出了代码。但是,它不保留空格,并且不仅仅用于属性“DELETE”。下面的例子 <?xml version="1.0" encoding="utf-8"?> <

我需要删除空节点,但保留带有空格的节点作为特定属性“delete”的值。我不太熟悉XSL…如何删除空值,但保留空格值

这最好仅适用于操作为“DELETE”的节点。例如,当操作为“DELETE”时,无论其他节点名称是什么(因为它们会更改),都应该删除空值的子节点。如果这是不可能的,我将满足于从整个XML文件中删除空值,下面列出了代码。但是,它不保留空格,并且不仅仅用于属性“DELETE”。下面的例子

<?xml version="1.0" encoding="utf-8"?>
<test xmlns:n0="http://mynamespace">
 <Value Action="DELETE">
    <Example1> </Example1>
    <Test2 />
    <Example3></Example3>
 </Value>
 <Value Action="UPDATE">
   <space> </space>
    <null />
    <null2></null2>
 </Value>
</test>

预期结果:

<?xml version="1.0" encoding="utf-8"?>
<test xmlns:n0="http://mynamespace">
   <Value Action="DELETE">
     <Example1> </Example1>
   </Value>
   <Value Action="UPDATE">
     <space> </space>
     <null />
     <null2></null2>
   </Value>
</test>

删除所有空值:

<?xml version="1.0" encoding="UTF-8"?>

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

    <xsl:template match="*">
    <xsl:if test=". != '' or ./@* != ''">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:if>
    </xsl:template>

   <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
   </xsl:template>
       <xsl:template match="text() | comment() | processing-instruction()">
       <xsl:copy />
    </xsl:template>
</xsl:stylesheet>

复制所有节点并在下一个模板中匹配避免节点,请参见下面的XSL(编辑的):


结果(已编辑)):


您需要:

  • 复制所有输入的标识模板

  • 匹配满足以下两个条件的每个节点的模板:

    • 它包含在值节点中,操作属性设置为DELETE
    • 其名称包含null
    忽略这些节点

    这是一个比单个模板更通用、更简洁的解决方案 对于每个节点名称(null,null 2,…)

  • (可选)模板“阻塞”纯空白文本节点,包含 换行字符。原因是要阻止换行符文本节点 标记之间,但“通过”,例如
    space
    标记中包含的空格

  • 因此,整个脚本可以如下所示:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    
      <xsl:template match="Value[@Action = 'DELETE']/*[contains(name(), 'null')]"/>
    
      <xsl:template match="text()[not(normalize-space())][contains(.,'&#xA;')]"/>
    
      <xsl:template match="@*|node()">
        <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
      </xsl:template>
    </xsl:transform>
    
    
    
    还可以考虑
    删除节点之间的空格。这是否只针对节点名“null”和“null2”?我想删除具有该操作的任何节点的空值。@Toya我已经编辑了XSL代码,现在它更具动态性-它将删除名称中包含“null”的所有元素(例如,它将删除诸如“tttnull”、“null2”或仅“null”之类的元素)。还添加了防止节点之间出现空格的功能——感谢note Parfait。非常感谢,不过我使用了“null”名称作为示例。我的意思是,这应该取决于行动,而不是孩子的名字。我将更新我的示例。@Valdi_-Bo只有当用于删除的节点以“null”开头时,您的代码才是好的,如果该值具有-这将不起作用。安全方法是使用contains,请参阅我编辑的示例。您只提供了示例标记,名称以null开头。如果任务是消除所有包含null的标记,那么第二个谓词必须包含contains函数来代替start with(正如我刚才在脚本中所做的更改)。我已经更新了我的问题。谢谢。问题已编辑。
    <test xmlns:n0="http://mynamespace">
        <Value Action="DELETE">
            <space/>
        </Value>
        <Value Action="UPDATE">
            <space/>
            <null/>
            <null2/>
        </Value>
    </test>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    
      <xsl:template match="Value[@Action = 'DELETE']/*[contains(name(), 'null')]"/>
    
      <xsl:template match="text()[not(normalize-space())][contains(.,'&#xA;')]"/>
    
      <xsl:template match="@*|node()">
        <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
      </xsl:template>
    </xsl:transform>