Xml 具有多文档上下文的转换
我有一个使用外部文档的xsl。xsl包含xsl:key元素,在使用外部文档时,该元素无法正常工作Xml 具有多文档上下文的转换,xml,xslt,xslt-1.0,document,Xml,Xslt,Xslt 1.0,Document,我有一个使用外部文档的xsl。xsl包含xsl:key元素,在使用外部文档时,该元素无法正常工作 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="utf-8"/> <xsl:param name="People"></xsl:param> <xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8"/>
<xsl:param name="People"></xsl:param>
<xsl:param name="Abstracts"></xsl:param>
<xsl:key name="uniqueAfflTags" match="AFFL" use="concat(../../../../@id,@number)"/>
<xsl:variable name="abstracts" select="document($Abstracts)//ABSTRACT"/>
<!--Root template -->
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
</head>
<body>
<xsl:apply-templates select="//PRESENTATIONS/PRESENTATION[@type!='placeholder']">
<xsl:sort select="AUTHORS/AUTHOR[1]/LNAME"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="PRESENTATION">
<xsl:variable name="ctrlid" select="@control_id"/>
<xsl:text> </xsl:text>
<!-- Category -->
<xsl:if test="string-length($abstracts[@id=$ctrlid]/ABSTRACT_CATEGORY/CATEGORY_GROUP/CATEGORY) > 0">
<xsl:text> - </xsl:text>
<span class="Category">
<xsl:value-of select="$abstracts[@id=$ctrlid]/ABSTRACT_CATEGORY/CATEGORY_GROUP/CATEGORY"/>
</span>
</xsl:if>
<xsl:apply-templates select="descendant::AFFL">
<xsl:sort select="@number" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="AFFL">
<xsl:if test="generate-id()=generate-id(key('uniqueAfflTags',concat(../../../../@id,@number))[1])">
(<xsl:value-of select="@number"/>)
<xsl:if test="string-length(DEPT) > 0">
<xsl:value-of select="DEPT"/>
</xsl:if>
<xsl:if test="string-length(INST) > 0">
<xsl:if test="string-length(DEPT) > 0">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="INST"/>
</xsl:if>
<xsl:if test="string-length(CITY) > 0">
<xsl:if test="string-length(INST) > 0 or string-length(DEPT) > 0">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="CITY"/>
</xsl:if>
<xsl:if test="string-length(STATE) > 0">
<xsl:if test="string-length(CITY) > 0 or string-length(INST) > 0 or string-length(DEPT) > 0">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="STATE"/>
</xsl:if>
<xsl:if test="string-length(COUNTRY) > 0">
<xsl:if test="COUNTRY!='United States'">
<xsl:if test="string-length(STATE) > 0 or string-length(CITY) > 0 or string-length(INST) > 0 or string-length(DEPT) > 0">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="COUNTRY"/>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template match="text()">
</xsl:template>
</xsl:stylesheet>
-
()
,
,
,
,
对于当前xsl,AFFL模板匹配中的if条件不满足要求。如果我删除这些行:
<xsl:variable name="ctrlid" select="@control_id"/>
<xsl:text> </xsl:text>
<!-- Category -->
<xsl:if test="string-length($abstracts[@id=$ctrlid]/ABSTRACT_CATEGORY/CATEGORY_GROUP/CATEGORY) > 0">
<xsl:text> - </xsl:text>
<span class="Category">
<xsl:value-of select="$abstracts[@id=$ctrlid]/ABSTRACT_CATEGORY/CATEGORY_GROUP/CATEGORY"/>
</span>
</xsl:if>
-
它开始工作了。问题看起来是上下文不正确,但我无法正确设置上下文。
非常感谢您的帮助。
谢谢
输入xml->主xml(会话)
第二个xml(抽象xml)--
如果这确实是一个上下文问题,那么我应该如何选择基础文档的上下文。关键索引是针对每个文档构建的,关键功能在当前上下文节点的文档上工作,因此通常对于多个文档,您需要确保更改上下文,例如
<xsl:variable name="some-key-value" select="foo"/>
<xsl:for-each select="$otherDoc">
<xsl:apply-templates select="key('key-name', $some-key-value)"/>
</xsl:for-each>
在XSLT1.0或XSLT2.0中,您可以将其缩短为
<xsl:apply-templates select="key('key-name', foo, $otherDoc)"/>
如果您需要更具体的帮助,请向我们展示您输入文档的结构。我可以要求您输入XML和预期输出吗?我有两个XML,一个是应用此xsl的会话,另一个是通过文档使用的抽象XML。AFFL选项卡的模板匹配应适用于当前上下文,该上下文是xsl应用于该会话的会话。我需要在这个上下文中获得唯一的affl信息,这是会话xml,但它没有发生。我将用输入xml的相关部分更新这个问题。我发现另外一件事是,如果您在密钥和多文档上下文中使用生成id,它的工作方式与您想要的不一样。
<xsl:variable name="some-key-value" select="foo"/>
<xsl:for-each select="$otherDoc">
<xsl:apply-templates select="key('key-name', $some-key-value)"/>
</xsl:for-each>
<xsl:apply-templates select="key('key-name', foo, $otherDoc)"/>