3

我们有一个 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:Productcm: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:Productcm:Subscription,这在我的特定输入 xml 中有效,但问题是我不知道它实际上是 cm:Subscription。我所“知道”的是它是一个扩展的元素cm:Product

4

1 回答 1

1
<xsl:template match="element(*, cm:Product)/cm:name">

应该这样做,但你需要添加一个合适的顶级

<xsl:import-schema namespace="https://schema" schema-location="....." />

当然它要求你的处理器是模式感知的。

于 2012-10-01T18:13:22.363 回答