Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 具有多文档上下文的转换_Xml_Xslt_Xslt 1.0_Document - Fatal编程技术网

Xml 具有多文档上下文的转换

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。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: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) &gt; 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) &gt; 0">
        <xsl:value-of select="DEPT"/>
      </xsl:if>

      <xsl:if test="string-length(INST) &gt; 0">
        <xsl:if test="string-length(DEPT) &gt; 0">
          <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:value-of select="INST"/>
      </xsl:if>

      <xsl:if test="string-length(CITY) &gt; 0">
        <xsl:if test="string-length(INST) &gt; 0 or string-length(DEPT) &gt; 0">
          <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:value-of select="CITY"/>
      </xsl:if>

      <xsl:if test="string-length(STATE) &gt; 0">
        <xsl:if test="string-length(CITY) &gt; 0 or string-length(INST) &gt; 0 or string-length(DEPT) &gt; 0">
          <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:value-of select="STATE"/>
      </xsl:if>

      <xsl:if test="string-length(COUNTRY) &gt; 0">
        <xsl:if test="COUNTRY!='United States'">
          <xsl:if test="string-length(STATE) &gt; 0 or string-length(CITY) &gt; 0 or string-length(INST) &gt; 0 or string-length(DEPT) &gt; 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) &gt; 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)"/>