我有一個XSD文檔,我試圖用XSL解析文檔用途,其中complexTypes經常包含其他complexTypes的元素。如果可能,我想在容器旁邊顯示這些複雜類型元素的內容。這裏是我工作的一個簡單的例子:使用XSL擴展XSD複雜元素類型?
<xs:complexType name="S">
<xs:sequence>
<xs:element name="A" type="X"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="X">
<xs:sequence>
<xs:element name="F"/>
<xs:element name="G"/>
<xs:element name="H"/>
</xs:sequence>
</xs:complexType>
我將如何得到上面顯示的是這樣的:「S包含X型的(包含F,G和H)」?
感謝您提前提供任何幫助!
新增例如:
<xsl:for-each select="*">
<xsl:choose>
<!-- call template without param -->
<xsl:when test="name() = 'xs:complexType'">
<xsl:value-of select="@name"/>
<xsl:text> contains </xsl:text>
<xsl:call-template name="top"/>
<xsl:text>
</xsl:text>
</xsl:when>
<!-- for contained elements with types -->
<xsl:when test="@type != '' and name() = 'xs:element' and $typeToLocate = ''">
<xsl:value-of select="@name"/>
<xsl:text> of type </xsl:text>
<xsl:value-of select="@type"/>
<xsl:text>(which contains: </xsl:text>
<!--
point at which i want processor to return to root, locate the
indicated complex type, output its contents then continue going
through schema.
-->
<xsl:call-template name="top">
<xsl:with-param name="typeToLocate" select="@type"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
</xsl:when>
<!-- when type is located, send it to signal proper output -->
<xsl:when test="$typeToLocate != '' and $typeToLocate = @name">
<xsl:call-template name="top">
<xsl:with-param name="typeToLocate" select="$typeToLocate"/>
</xsl:call-template>
</xsl:when>
<!-- for elements contained in indicated type -->
<xsl:when test="$typeToLocate != '' and name() = 'xs:element'">
<xsl:value-of select="@name"/>
<xsl:text> </xsl:text>
<xsl:call-template name="top">
<xsl:with-param name="typeToLocate" select="$typeToLocate"/>
</xsl:call-template>
</xsl:when>
<!-- for continuing through non-content elements under found type -->
<xsl:when test="$typeToLocate != ''">
<xsl:call-template name="top">
<xsl:with-param name="typeToLocate" select="$typeToLocate"/>
</xsl:call-template>
</xsl:when>
<!-- for ignoring non-content elements during normal processing -->
<xsl:otherwise>
<xsl:call-template name="top"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
爲了擴大Garrison的迴應,缺少爲您編寫代碼(我不這樣做,這不是一個免費的編程服務),不知道你卡在哪裏就很難回答這個問題。向我們展示您在解決方案上的最佳嘗試將揭示您知道的以及您不知道的內容,這將有助於我們提出可幫助您的答案。 –
對不起,添加了我已經寫過的部分(會更快地附加它,但它不太可讀)的編輯。希望它傳達我正在尋找的東西。 – erodious
只是好奇,這是爲了測量XSLT/XSD技能的某種任務嗎?或者一個有趣的項目爲一個特定的XSD?我問的原因......如果你使用XML命名空間怎麼辦?你打算將前綴擴展到URI嗎?如果XSD引用其他XSD(包括/導入/重新定義)會怎麼樣?爲了好玩,嘗試編寫一些循環依賴關係:類型,組或XSD文件...我的意思是,如果您使用的是現實生活中的XSD,則可能需要重新考慮對此特定任務使用XSLT。 –