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