0

xsl:key および key() 関数のチュートリアルを検索して見つけましたが、どういうわけかまだ理解が足りないようです。

実行する必要がある XML-XML 変換があります。これには、ソース XML から文字列値を取得し、(提供された) 適切なルックアップ テーブルから適切な数値コードを見つけ、それらのコードを結果の XML に配置する必要がある 10 個のフィールドが含まれます。

ルックアップテーブルに対して xsl:for-each を実行するこれの作業バージョンがありますが、最適ではないのではないかと考えており、代わりに select="key('CR-Lookup',$CR)" を使用する必要があったかどうかを知りたいです。 .

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

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

次のようなものに変換されます。

<Contributor>
<ContributorRole id="7" code="818"/>
<Value id="Name">Anglet, J.</Value>
</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 ファイルで、照合を試みます。

<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

2 に答える 2

5

キーを使用する前に、コンテキスト ドキュメントを切り替えました。

<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>
          ...

XSLT 2.0 でできること

<xsl:for-each select="key('CR-lookup', $CR, $CRTable)">
于 2009-05-12T12:51:09.400 に答える
-3

Xslt キー関数の最適な使用方法を知っておく必要があると思います。

于 2011-12-22T03:39:54.563 に答える