我刚刚开始使用 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/