gpt4 book ai didi

使用 key() 和 document() 的 XSLT 2.0 外部查找

转载 作者:行者123 更新时间:2023-12-04 17:59:34 26 4
gpt4 key购买 nike

我正在拔出我剩下的头发,试图使用 Saxon 9.1.0.7 进行简单的外部查找。

我有一个简单的源文件 dummy.xml :

<something>
<monkey>
<genrecode>AAA</genrecode>
</monkey>
<monkey>
<genrecode>BBB</genrecode>
</monkey>
<monkey>
<genrecode>ZZZ</genrecode>
</monkey>
<monkey>
<genrecode>ZER</genrecode>
</monkey>
</something>

那么查找文件是 GenreSet_124.xml :
<GetGenreMappingObjectsResponse>
<tuple>
<old>
<GenreMapping DepartmentCode="AAA"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="10 - NEWS"/>
</old>
</tuple>
<tuple>
<old>
<GenreMapping DepartmentCode="BBB"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="11 - NEWS"/>
</old>
</tuple>

... lots more
</GetGenreMappingObjectsResponse>

我想要实现的只是根据“部门代码”值获取“流派”值。

所以我的 XSL 看起来像:
...
<!-- Set up the genre lookup key -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>


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

<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>

<xsl:apply-templates select="$lookupDoc">
<xsl:with-param name="curr-label" select="genrecode"/>
</xsl:apply-templates>

</Genre>
</xsl:for-each>
</stuff>
</xsl:template>

<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>

<xsl:value-of select="key('genre-lookup', $curr-genrecode)/@Genre"/>

</xsl:template>

...

我的问题是我一无所获。我目前只是得到
<?xml version="1.0" encoding="UTF-8"?>
<stuff>
<Genre/>
<Genre/>
<Genre/>
<Genre/>
</stuff>

我已将所有查找数据移动为 GenreMapping 的属性,以前作为 GenreMapping 的子元素,每当我输入模板 match="GetGenreMappingObjectsResponse"时,它只会打印出每个 GenreMapping (DepartmentCode, DepartmentName, Genre) 中的所有文本!

我一生都无法弄清楚我做错了什么。任何帮助/建议将不胜感激。

请找到当前实际的 XSLT 列表:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- Define the global parameters -->
<xsl:param name="TransformationID"/>
<xsl:param name="TransformationType"/>

<!-- Specify that XML is the desired output type -->
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<!-- Set up the genre matching capability -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>

<xsl:variable name="documentPath"><xsl:value-of select="concat('GenreSet_',$TransformationID,'.xml')"/></xsl:variable>
<xsl:variable name="lookupDoc" select="document($documentPath)"/>

<!-- Start the first match on the Root level -->
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template >

<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup', $curr-genrecode, $lookupDoc)/@Genre"/>
</xsl:template>
</xsl:stylesheet>

TransformationID 始终为 124(因此会打开正确的查找文件。Type 只是我目前未使用但打算使用的名称。

最佳答案

在 XSLT 2.0 中有两种方法可以做你想做的事:

一种是key的三参数版本功能。第三个参数允许您指定您希望 key 处理的根节点(默认情况下,它始终是主文档的根节点):

<xsl:value-of select="key('genre-lookup', $curr-genrecode,$lookupDoc)/@Genre"/>

另一种方法是使用 key $lookupDoc下的函数节点:
<xsl:value-of select="$lookupDoc/key('genre-lookup', $curr-genrecode)/@Genre"/>

这两种方法都记录在 XSLT 2.0 specification on keys 中。 ,并且在 XSLT 1.0 中不起作用。

为完整起见,如果您仅限于 XSLT 1.0,则必须将其重写为不使用 key 。
<xsl:value-of select="$lookupDoc//GenreMapping[@DepartmentCode = $curr-genrecode]/@Genre"/>

啊哈! 问题是 select="$lookupDoc"在您的 apply-templates call 正在调用默认模板而不是您期望的模板,因此参数正在丢失。

改成这样:
<xsl:apply-templates select="$lookupDoc/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>

这将正确调用您的模板,并且 key 应该可以工作。

所以最终的 XSLT 表应该是这样的:
  <xsl:variable name="lookupDoc" select="document('XMLFile2.xml')"/>
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template>
<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup',$curr-genrecode,$lookupDoc)/@Genre"/>
</xsl:template>

( Source of information )

关于使用 key() 和 document() 的 XSLT 2.0 外部查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com