2016-04-05 13 views
3

XSLTの内部私はXMLから来ている状態を持っており、その状態に対応して、私は変換されたXMLに入れたい自分の状態コードを持っています。XSLT内でキー値のペアを作成し、キーを使用して値を取得する方法

ソースXML:

<states> 
<state>New York</state> 
<state>California</state> 
</states> 

期待される結果:

<states> 
    <state>NY</state> 
    <state>CA</state> 
</states> 

ときまたは文はそう彼らのいずれかの最適化の方法であるならば、私はを使用することはできませんので、私は状態のリストを持っているとXSLT 1.0または2.0でこの問題を解決するには?前もって感謝します。ここで

+0

あなたがの抜粋であなたの質問を拡張することができます状態のリスト(マッピング)? – zx485

+0

XSLT 2.0では、マッピングテーブルをスタイルシートのグローバル変数に入れることができます。純粋な1.0ではそうすることはできませんが、多くのプロセッサーが提供するexslt:node-set()関数が可能になります。 –

答えて

0

は、あなたがそれを見ることができる一つの方法です:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="http://example.com/my"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="state" match="state" use="." /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="state"> 
    <xsl:copy> 
     <xsl:value-of select="key('state', ., document(''))/@code"/> 
    </xsl:copy> 
</xsl:template> 

<my:states> 
    <state code="AL">Alabama</state> 
    <state code="AK">Alaska</state> 
    <state code="AZ">Arizona</state> 
    <state code="AR">Arkansas</state> 
    <state code="CA">California</state> 
    <state code="CO">Colorado</state> 
    <state code="CT">Connecticut</state> 
    <state code="DE">Delaware</state> 
    <state code="DC">District of Columbia</state> 
    <state code="FL">Florida</state> 
    <state code="GA">Georgia</state> 
    <state code="HI">Hawaii</state> 
    <state code="ID">Idaho</state> 
    <state code="IL">Illinois</state> 
    <state code="IN">Indiana</state> 
    <state code="IA">Iowa</state> 
    <state code="KS">Kansas</state> 
    <state code="KY">Kentucky</state> 
    <state code="LA">Louisiana</state> 
    <state code="ME">Maine</state> 
    <state code="MD">Maryland</state> 
    <state code="MA">Massachusetts</state> 
    <state code="MI">Michigan</state> 
    <state code="MN">Minnesota</state> 
    <state code="MS">Mississippi</state> 
    <state code="MO">Missouri</state> 
    <state code="MT">Montana</state> 
    <state code="NE">Nebraska</state> 
    <state code="NV">Nevada</state> 
    <state code="NH">New Hampshire</state> 
    <state code="NJ">New Jersey</state> 
    <state code="NM">New Mexico</state> 
    <state code="NY">New York</state> 
    <state code="NC">North Carolina</state> 
    <state code="ND">North Dakota</state> 
    <state code="OH">Ohio</state> 
    <state code="OK">Oklahoma</state> 
    <state code="OR">Oregon</state> 
    <state code="PA">Pennsylvania</state> 
    <state code="RI">Rhode Island</state> 
    <state code="SC">South Carolina</state> 
    <state code="SD">South Dakota</state> 
    <state code="TN">Tennessee</state> 
    <state code="TX">Texas</state> 
    <state code="UT">Utah</state> 
    <state code="VT">Vermont</state> 
    <state code="VA">Virginia</state> 
    <state code="WA">Washington</state> 
    <state code="WV">West Virginia</state> 
    <state code="WI">Wisconsin</state> 
    <state code="WY">Wyoming</state> 
</my:states> 

</xsl:stylesheet> 

ご希望の場合は、外部からのXML文書とルックアップでの状態とそのコードのリストを置くことができそこ。

As I have list of states so I can't use when or If statement

実際には、xsl:chooseを使用しても同様に動作します。

+0

xsltを使用して変換しようとすると、以下のエラーが発生します。エラー:org.xml.sax.SAXParseException; systemId:file:/base/data/home/apps/s~xslttest-hrd2/5.391785634117992591/; lineNumber:1; columnNumber:1;コンテンツはプロローグで許可されていません。私はhttp://xslttest.appspot.com/を使用しています。もう1つのことを私は上記のテンプレートを私の他のテンプレートに呼び出すことができますか? –

+0

オンラインXSLTサービスを使用してこれをテストすることはできません。実際のXSLTファイルをdocument()関数で検出する必要があるためです。 –

+0

@JyotishSinghあなたの質問には答えられませんか? –

0

外部ファイルをマッピングに含めて、マッピングにアクセスすることができます。私はファイル名として 'b1.xml'を使用しました。フルネームをショートネームに置き換えます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="StateMap" select="document('b1.xml')/StateMapping" /> 

    <xsl:template match="states"> 
    <states>   
     <xsl:apply-templates select="state" /> 
    </states> 
    </xsl:template> 

    <xsl:template match="state"> 
    <xsl:variable name="toMap" select="text()" /> 
    <state><xsl:value-of select="$StateMap/Map[@name = $toMap]" /></state> 
    </xsl:template> 

</xsl:stylesheet> 

あなたがあなた自身に置き換えなければならない外部のマッピングファイルは、次のとおりです。

<?xml version="1.0"?> 
<StateMapping> 
    <Map name="New York">NY</Map> 
    <Map name="California">CA</Map> 
</StateMapping> 

出力は次のとおりです。

<?xml version="1.0"?> 
<states> 
    <state>NY</state> 
    <state>CA</state> 
</states> 
+0

申し訳ありませんが、外部ファイルは使用できません。 –

+0

あなたの質問に記載されているような外部ファイルの州のリストはありませんか? – zx485

+0

いいえ、私のリストはXSLT内にあるはずです。 –

関連する問題