目标
我想复制所有 XML,但属性值包含特定字符的地方除外,在本例中为 .
。在 .
存在的地方,删除具有该属性的元素及其所有子元素。我是 xslt 的新手,读过一些书,但我似乎无法找到一种方法来获取父项及其所有子项。
当前的 XSL
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="descendant-or-self::root/*/@name[contains(., '.')]" />
示例 XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<complexType name="tableData2File">
<complexContent>
<extension base="taskElement">
<sequence>
<element name="source" type="tableData2File.source" />
<element name="parser" type="parser" />
<element name="target" type="node.uri" />
</sequence>
<attribute name="addNewColumns" type="minlength" use="optional" />
</extension>
</complexContent>
</complexType>
<!--
match idViolationsCount.test,
then remove all its content
-->
<complexType name="idViolationsCount.test">
<complexContent>
<extension base="tableTask">
<sequence>
<element name="index" type="columnsNoAs" minOccurs="1" />
<element name="condition" type="stringWithRef" minOccurs="0" />
<element name="allowExpressions" type="boolWithRef" minOccurs="0" />
</sequence>
<attribute name="mode" type="mergeMode" use="required" />
</extension>
</complexContent>
</complexType>
</root>
所需的输出 XML
<root>
<complexType name="tableData2File">
<complexContent>
<extension base="taskElement">
<sequence>
<element name="source" type="tableData2File.source" />
<element name="parser" type="parser" />
<element name="target" type="node.uri" />
</sequence>
<attribute name="addNewColumns" type="minlength" use="optional" />
</extension>
</complexContent>
</complexType>
<!-- no idViolationsCount.test! -->
</root>
最佳答案
这看起来是正确的方法(身份模板,覆盖您要删除的内容),但您不能在匹配模式中使用 descendant-or-self::
。然而,你不需要,只是
<xsl:template match="root/*[contains(@name, '.')]" />
应该做的工作。请注意,您的 root/*/@name[contains(., '.')]
的原始匹配模式将匹配 name
属性节点,而不是承载它的元素, 所以你最终会删除属性但保持元素完好无损。
您不需要对已删除元素的子元素做任何特殊操作 - 这个空模板将删除整个元素,包括它的内容,如果您只想删除这个元素但保留它的子元素,那么您需要一个不同的模板
<xsl:template match="root/*[contains(@name, '.')]">
<!-- don't output anything now, but keep processing children -->
<xsl:apply-templates />
</xsl:template>
关于xml - XSLT:复制所有 XML,但属性包含值的地方除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26304486/