4

XSD で定義された有効な列挙オプションに基づいていくつかの要素を生成する必要がある XML ファイルを変換しています。

次のような型と要素を宣言する XSD があるとします。

<xs:simpleType name="optionType" nillable="true">
    <xs:restriction base="xs:string">
        <xs:maxLength value="50"/>
        <xs:enumeration value="USERCHOICE">
        </xs:enumeration>
        <xs:enumeration value="DEFAULT">
        </xs:enumeration>
        </xs:restriction>
</xs:simpleType>
...
<xs:element name="chosenOption" type='optionType'/>
...
<xs:element name="availableOption" type='optionType'/>

入力には選択したオプションのみが含まれるため、次のようになると想像できます。

<options>
     <chosenOption>USERCHOICE</chosenOption>
</options>

次のような出力が必要です。

<options>
    <chosenOption>USERCHOICE</chosenOption> <!-- This comes from incoming XML -->

    <!-- This must be a list of ALL possible values for this element, as defined in XSD -->
    <availableOptions>
        <availableOption>USERCHOICE</availableOption>
        <availableOption>DEFAULT</availableOption>
    </availableOptions>
</options>

XSL で列挙値USERCHOICEDEFAULTXSD から抽出し、出力で生成する方法はありますか?

これは WebSphere 6 で実行され、XSLT 1.0 エンジンで使用されます。:(

(スキーマ ファイルは頻繁に変更されるわけではありませんが、時々変更されるため、スキーマ ファイルと XSLT を更新するのではなく、スキーマ ファイルを更新するだけで済みます)

4

1 に答える 1

5

入力 XML と XSD が上記のサンプルと同じくらい単純であることを前提としたプロトタイプを次に示します。それらが変化する可能性がある方法に従って微調整すること。その微調整についてサポートが必要な場合は、お知らせください。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   exclude-result-prefixes="xs"
   version="1.0">

   <xsl:variable name="xsd" select="document('mySchema.xsd')"/>

   <xsl:template match="/options">
      <xsl:copy>
         <xsl:for-each select="*">
            <xsl:variable name="eltName" select="local-name()"/>
            <xsl:copy-of select="." />
            <availableOptions>
               <xsl:variable name="optionType"
                  select="$xsd//xs:element[@name = $eltName]/@type"/>
               <xsl:apply-templates
                  select="$xsd//xs:simpleType[@name = $optionType]/
                       xs:restriction/xs:enumeration"/>
            </availableOptions>
         </xsl:for-each>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="xs:enumeration">
      <availableOption><xsl:value-of select="@value" /></availableOption>
   </xsl:template>
</xsl:stylesheet>
于 2012-08-13T19:45:16.373 に答える