2009-05-12 24 views
0

私はxsl:keyとkey()関数のチュートリアルを検索しましたが、どういうわけか、まだ理解できていないようです。XSLT外部ルックアップテーブルの正しい使い方 - key()関数?

XML-XML変換が必要です。ソースXMLから文字列値を取得し、適切なルックアップテーブル(提供されている)から適切な数値コードを見つけて、これらのコードを結果のXML。

ルックアップテーブルのxsl:for-eachを実行している作業版がありますが、それは最適ではないと思われ、select = "key( 'CR-Lookup'、$ CR ) "代わりにsomhow。

だから、私がやりたいこと(ツリーの深い部分)である:

<Contributor> 
<ContributorRole id="7" code="818"/> 
<Value id="Name">Anglet, J.</Value> 
</Contributor> 

私はこれのように作ったファイル:

<Contributor> 
<ContributorRole>producer</ContributorRole> 
<ContributorName>Anglet, J.</ContributorName> 
</Contributor> 

はこのようなものに変換します

のルックアップテーブルファイルlookup_ContributorRole.xml

<lookup id="ContributorRole"> 
<row> 
    <id>7</id> 
    <parentid>NULL</parentid> 
    <valueMember>1</valueMember> 
    <displayMember>producer</displayMember> 
    <code>818</code> 
    <externalId>NULL</externalId> 
    <description>NULL</description> 
</row> 
<!-- more <row>s...--> 
</lookup> 

Amdの私は、マッチングを行うにしようXSLTファイル、:あなたはXSLT 2.0では

<xsl:variable name="CRTable" select="document('lookup_ContributorRole.xml')"/> 

<xsl:template match="Contributor"> 
    <Contributor> 
    <xsl:variable name="CR" select="ContributorRole"/> 
    <ContributorRole> 
     <xsl:for-each select="$CRTable"><!-- change context document --> 
     <xsl:for-each select="key('CR-lookup', $CR)"> 
      <xsl:attribute name="id"><xsl:value-of select="id"/></xsl:attribute> 
      <xsl:attribute name="code"><xsl:value-of select="code"/></xsl:attribute> 
      ... 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foxml="info:fedora/fedora-system:def/foxml#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:rel="info:fedora/fedora-system:def/relations-external#" 
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema" 
    xmlns:audit="info:fedora/fedora-system:def/audit#" 
    xmlns:fedoraxsi="http://www.w3.org/2001/XMLSchema-instance" 

    exclude-result-prefixes="xsl foxml rdf rel oai_dc dc xsi audit fedoraxsi" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" /> 

<xsl:key name="CR-lookup" match="row" use="displayMember"/> 
<xsl:variable name="CRTable" select="document('lookup_ContributorRole.xml')/lookup/row"/> 

<xsl:template match="Contributor"> 
    <Contributor> 
    <xsl:variable name="CR"><xsl:value-of select="ContributorRole"/></xsl:variable> 
    <ContributorRole> 
    <xsl:for-each select="$CRTable"> 
     <xsl:if test="displayMember=$CR"> 
      <xsl:attribute name="id"><xsl:value-of select="id"/></xsl:attribute> 
      <xsl:attribute name="code"><xsl:value-of select="code"/></xsl:attribute> 
     </xsl:if> 
    </xsl:for-each> 
    </ContributorRole> 
    <Value id="Name"><xsl:value-of select="ContributorName"/></Value> 
    </Contributor> 
</xsl:template> 

    <xsl:template match="/"> 
    <DigitalObject> 
     <Core> 
      <xsl:for-each select="/foxml:digitalObject/foxml:datastream[@ID='DigitalObjectLL']/foxml:datastreamVersion"> 
      <xsl:sort select="@CREATED" order="descending"/> 
      <xsl:if test="position() = 1"> 
       <xsl:for-each select="./foxml:xmlContent/lnbdo"> 
        <xsl:apply-templates select="Contributor"/> 
       </xsl:for-each> 
      </xsl:if> 
      </xsl:for-each> 
     </Core> 
    </DigitalObject> 
    </xsl:template> 
</xsl:stylesheet> 

答えて

4

キーを使用する前に、コンテキスト文書を切り替えていますできます

<xsl:for-each select="key('CR-lookup', $CR, $CRTable)"> 
+0

aha、ありがとう。 しかし、それでも最初の$ CRTable for-eachを使用する必要があることを意味するので、2番目のfor-each(select = "key(...)")とxsl:代わりに(これは私がやったことです)。 – Gnudiff

+0

私はコードを誤解していると思います。 xsl:ifがキーを必要としないことを反映するように答えを更新しました。 – jelovirt

+0

ああ、私は今、感謝を見る! – Gnudiff

関連する問題