xml - XSLT:复制所有 XML,但属性包含值的地方除外

标签 xml xslt xsd

目标

我想复制所有 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/

相关文章:

java - HttpResponse 中的阿拉伯语格式错误

xslt - XSL : Select all text in a node, 特定类型的节点除外

XSLT 2.0 - 将节点集作为参数传递似乎不起作用

xslt - 浏览器不受支持的 Tridion 2011 SP1 富文本 XSLT 中的命名空间问题

user-interface - 从 Xsd 构建 UI 的工具包或应用程序

xsd - 如何在 <xs :all>? 中使项目可选

java - 将 JAXB 对象存储到多个 XML 文件中

c# - 如何使用 Unity 3D 将数据保存到 Google SpreadSheet

xml - 何时使用 xsl 测试属性值

java - 如何使用 JAXB 生成单独的 XSD 文件?