2
<xsl:variable name="map">
   <map>
        <item key="Name" value="John"/>
        <item key="Address" value="Un_Known"/>
        <item key="Phone" value="(878)876678"/>
        <item key="Last Name" value="Verner"/>
    </map>
</xsl:variable>

<xsl:for-each select "$map/map/item">
   <xsl:if test="./@key = $input">
      <!-- cool user is asking for something know .. do something fancy -->
   </xsl:if>
<xsl:for-each>

XSLTで構造のようなマップを宣言してから、それにアクセスしたいと思います。どうやら、私は余分な名前空間を使用したくないので、exsl:node-setを使用することは私が今探している解決策ではありません。

XSLT1.0Saxonを使用しています。

私がやろうとしていることをするためのより良い方法はありますか?

ありがとうカレフル


下記のすべての答えは正しく、有効です。最終的に「exsl:node-set」を使用することにしました

あなたの提案をありがとう..

4

4 に答える 4

2

Saxonを使用している場合、XSLT1.0をまだ使用している理由を理解するのは非常に困難です。この種のこと(および他の多くのこと)は、XSLT2.0でははるかに簡単です-それはあなたが前進する時です。

于 2012-08-28T08:25:13.883 に答える
1

拡張機能を使用したくない場合は、データを別のXMLファイルにnode-set()入れることができます。次に、を使用してスタイルシートからそのファイルにアクセスします。次に、上で示したように、XPath式を使用してマップのコンテンツにアクセスできます。<map>map.xmldocument('map.xml')

于 2012-08-27T19:28:24.653 に答える
1

<map>XSLTに直接含めるなど、追加のXML情報を含めることができます。そのXMLデータは名前空間(XSLT名前空間以外)にバインドする必要がありますが、任意の名前空間にすることができます。

document()XSLTドキュメントをロードする空の文字列を持つ関数を使用して、XSLT内のデータにアクセスできます。

<xsl:if>ちなみに、選択したXPathで述語フィルターを使用することで、の必要性を排除できxsl:for-eachます。

例えば:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"
    xmlns:my="http://stackoverflow.com/questions/12146687/creating-a-map-in-xlst">

    <xsl:param name="input" />

    <my:map >
        <item key="Name" value="John"/>
        <item key="Address" value="Un_Known"/>
        <item key="Phone" value="(878)876678"/>
        <item key="Last Name" value="Verner"/>
    </my:map>

    <xsl:template match="/">
        <xsl:for-each select="document('')/*/my:map/item[@key=$input]">
                <!-- cool user is asking for something know .. do something fancy -->
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
于 2012-08-28T01:50:43.783 に答える
1

あなたは3つの非常に良い答えを得ました。

これは、キーを使用してルックアップテーブル(実際には別のXMLドキュメントに存在する)にアクセスする方法を示す別の例です。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pInput" select="'Phone'"/>
   <my:map>
        <item key="Name" value="John"/>
        <item key="Address" value="Un_Known"/>
        <item key="Phone" value="(878)876678"/>
        <item key="Last Name" value="Verner"/>
    </my:map>

 <xsl:key name="kLookup" match="item/@value" use="../@key"/>

 <xsl:template match="/">
     <xsl:for-each select="document('')">
       <xsl:value-of select="key('kLookup', $pInput)"/>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換が(使用されていない)XMLドキュメントに適用されると、必要な正しい結果が生成されます。

(878)876678

XSLT 2.0では、xsl:for-eachkey()この関数はインデックスを作成するドキュメントを指定する3番目の引数を受け入れるため、これは必要ありません。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pInput" select="'Phone'"/>
   <my:map>
        <item key="Name" value="John"/>
        <item key="Address" value="Un_Known"/>
        <item key="Phone" value="(878)876678"/>
        <item key="Last Name" value="Verner"/>
    </my:map>

 <xsl:key name="kLookup" match="item/@value" use="../@key"/>

 <xsl:template match="/">
       <xsl:value-of select="key('kLookup', $pInput, document(''))"/>
 </xsl:template>
</xsl:stylesheet>
于 2012-08-28T12:13:07.683 に答える