以下を定義する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>
製品名と他のいくつかのものを取り、それをWebサービス要求に変換するXSLTを作成する必要があります。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>
これは、特定の入力xmlにあるに変更cm:Product
するcm:Subscription
と機能しますが、問題は、それが実際にcm:Subscriptionであることを認識できないことです。私が「知っている」のは、それが拡張する要素であるということだけですcm:Product