xml - 如何在 XSLT 中编写身份转换来保留所选节点的子节点?

标签 xml xslt

我刚刚开始使用 XSLT,并且逐渐熟悉身份模板,这在很大程度上要归功于 Dimitre Novatchev,谁就该主题提供了一些很好的答案。

我正在执行 XML 到 XML 的转换,尝试隔离并仅复制大型架构文件的几个元素。这是数据的简化版本:

XSD 源

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" version="1.0">

<xsd:simpleType name="Alpha">
    <xsd:restriction base="xsd:decimal">
        <xsd:fractionDigits value="1"/>
        <xsd:minInclusive value="0.0"/>
        <xsd:maxInclusive value="100.0"/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="Bravo">
    <xsd:annotation>
        <xsd:documentation>
            Bravo data type.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:integer"/>
</xsd:simpleType>

<xsd:simpleType name="Charlie">
    <xsd:annotation>
        <xsd:documentation>
        Charlie data type.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:integer"/>
</xsd:simpleType>

<xsd:simpleType name="Delta">
    <xsd:annotation>
        <xsd:documentation>
        Delta data type.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:integer"/>
</xsd:simpleType>
</xsd:schema>

XSLT 样式表

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />   
<!-- identity template -->
<xsl:template match="/ | node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/node()[ 
                               not ( @name='Alpha')
                               and  
                               not ( @name='Charlie')
                                ]

                               "/>
</xsl:stylesheet>

结果

<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="Alpha"></xsd:simpleType>
<xsd:simpleType name="Charlie"></xsd:simpleType>
</xsd:schema>

这确实很接近,但我需要结果中选定节点 Alpha 和 Charlie 的子节点,就好像我执行了复制一样。

我需要什么

<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="Alpha">
        <xsd:restriction base="xsd:decimal">
        <xsd:fractionDigits value="1"/>
        <xsd:minInclusive value="0.0"/>
        <xsd:maxInclusive value="100.0"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="Charlie">
    <xsd:annotation>
        <xsd:documentation>
            Charlie data type.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:integer"/>
</xsd:simpleType>
</xsd:schema>

有没有办法用copy-of,来选择元素,或者在我的match子句中指定我想要递归到Alpha和Charlie的子元素?

谢谢!

最佳答案

您需要将逻辑反转为复制除“Bravo”和“Delta”元素之外的所有元素

空模板将如下所示:

<xsl:template match="xs:simpleType[@name[.='Bravo' or .='Delta']]"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

注意:添加命名空间,以防万一...

另一种方式,更具语义性:

<xsl:template match="/*/*[not(@name[.='Alpha' or .='Charlie'])]"/> 

关于xml - 如何在 XSLT 中编写身份转换来保留所选节点的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4898232/

相关文章:

.net - 将 XSL 转换应用于 XElement 的最佳方法是什么?

XSLT 创建没有 namespace 的内容

java - 如何配置maven依赖:analyze in the pom. xml

java - 使用 values.xml 设置 Android Activity 屏幕方向

xml - 在 R XML Xpath 中,@href 返回文本 "href"

Javascript XSLT 转换返回 null

date - 比较 XSLT 中的值时,< 和 lt 有什么区别?

java - Eclipse 中的 log4j.xml

android - 如何在使用 Android WebView 加载带有 css 的 xml 时动态更改样式?

java - 如何使用XSL动态设置属性值