我们有一个 XSD,它定义了以下内容:
<xsd:element name="Product" type="cm:Product" abstract="true" />
<xsd:complexType name="Product" abstract="true">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" minOccurs="0" />
<!-- Other common elements -->
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Subscription" type="cm:Subscription" />
<xsd:complexType name="Subscription">
<xsd:complexContent>
<xsd:extension base="cm:Product">
<xsd:sequence>
<!-- Subscription specific elements -->
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
我需要创建一个 XSLT,它采用产品名称和其他一些内容并将其转换为 Web 服务请求。问题是我真的不知道顶部元素是否真的说cm:Product
,cm:Subscription
或者完全不同的东西(但它扩展了 cm:Product)。
有没有办法我可以以某种方式编写一个匹配cm:Product
元素和所有扩展元素的模板cm:Product
?
简单示例输入
<Subscription xmlns="http://schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>Basis</name>
</Subscription>
到目前为止我所拥有的
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cm="http://schema"
exclude-result-prefixes="cm">
<xsl:param name="processID" />
<xsl:template match="/">
<xsl:element name="RequestElement">
<xsl:element name="processId">
<xsl:value-of select="$processID" />
</xsl:element>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="cm:Product/cm:name">
<xsl:element name="name">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
如果我更改cm:Product
为cm:Subscription
,这在我的特定输入 xml 中有效,但问题是我不知道它实际上是 cm:Subscription。我所“知道”的是它是一个扩展的元素cm:Product