与命名空间匹配的XSLT密钥
我有一个使用命名空间的XSD文档,简化为:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xns="urn:MyNs" targetNamespace="urn:MyNs">
<xs:complexType name="Type1">
<xs:sequence>
<xs:element name="xxx" type="xs:short" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Type2">
<xs:sequence>
<xs:element name="yyy" type="xs:short" />
<xs:element name="value" type="xns:Type1" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Type3">
<xs:sequence>
<xs:element name="yyy" type="xs:short" />
<xs:element name="value" type="xns:Type2" />
</xs:sequence>
</xs:complexType>
</xs:schema>
我需要处理该文件中的类型依赖关系,因为我有以下XSL(再次简化为最小示例):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" encoding="utf-8" indent="yes"/>
<xsl:param name="debug" select="no"/>
<xsl:strip-space elements="*"/>
<xsl:key name="type" match="xs:complexType" use="@name"/>
<xsl:template match="*" mode="print-dependency">
<xsl:value-of select="@name"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*" mode="process-type">
<xsl:apply-templates mode="print-dependency"
select="key('type', (
xs:attribute | xs:complexContent/xs:extension//xs:attribute |
xs:sequence/xs:element | xs:complexContent/xs:extension/xs:sequence/xs:element
)/@type)"/>
</xsl:template>
<xsl:template match="/xs:schema">
<xsl:apply-templates select="xs:complexType" mode="process-type">
<xsl:with-param name="debug" select="$debug"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
如果我在输入XSD文件中没有命名空间(即,如果我删除“xns”),则输出如预期:
Type1
Type2
(类型1显示为类型2和类型2依赖于类型3的依赖性)
但是,对于命名空间的输出是空的,类型名称显然不匹配。 即使在例子中使用名称空间时,是否可以管理它? (我不知道如何改变key()以匹配默认使用“targetNamespace”的complexType,因此没有在“name”中显式指定它)
好吧,为了根据@ michael的评论回答我自己的问题,我使用这个XSLT工作 - 删除key()
并使用显式匹配代替两个非剥离和剥离字符串:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" encoding="utf-8" indent="yes"/>
<xsl:param name="debug" select="no"/>
<xsl:strip-space elements="*"/>
<xsl:key name="type" match="xs:complexType" use="@name"/>
<xsl:template match="*" mode="print-dependency">
<xsl:value-of select="@name"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*" mode="process-dependency">
<xsl:variable name="type" select="@type"/>
<xsl:apply-templates mode="print-dependency"
select="//xs:complexType[@name=$type]"/>
<xsl:apply-templates mode="print-dependency"
select="//xs:complexType[@name=substring-after($type, ':')]"/>
</xsl:template>
<xsl:template match="*" mode="process-type">
<xsl:apply-templates mode="process-dependency"
select="(
xs:attribute | xs:complexContent/xs:extension//xs:attribute |
xs:sequence/xs:element | xs:complexContent/xs:extension/xs:sequence/xs:element
)"/>
</xsl:template>
<xsl:template match="/xs:schema">
<xsl:apply-templates select="xs:complexType" mode="process-type">
<xsl:with-param name="debug" select="$debug"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
这对名称空间和非名称空间类型名称(或这些名称的混合)完全符合我的需要。 可选地,如果类型名称可以包括名称空间并且没有名称空间,则可以添加另外两种额外的可能性。
链接地址: http://www.djcxy.com/p/34337.html上一篇: XSLT key matching with namespaces
下一篇: XSLT to transform XSD to another XSD with minOccurs tags