我已经搜索过并找到了一些xsl:key和key()函数的教程,但不知怎的,我仍然显然缺少一些理解。
我需要进行XML-XML转换,其中包括大约10个字段,您必须从源XML中获取字符串值,从适当的查找表(提供)中查找适当的数字代码,并将这些代码放入结果中XML。
我有一个工作版本的xsl:for-each用于查找表,但我怀疑它不是最理想的,我想知道我是否应该使用select =“key('CR-Lookup',$ CR) “而是somhow。
所以,我想做的是(树的深部):
<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>
在 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>
答案 0 :(得分:4)
您可以在使用密钥之前切换上下文文档:
<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)">
答案 1 :(得分:-1)
我认为您需要了解使用Xslt key function的最佳方式。