【问题标题】:xslt/saxon - using key() with collection() : content is not allowed in prolog?xslt/saxon - 将 key() 与 collection() 一起使用:prolog 中不允许内容?
【发布时间】:2018-10-22 12:52:22
【问题描述】:

我在file:///Users/username/foopath 有一组 tei-xml 文档。我需要从 XSLT 2.0 转换中访问这些文档以获取密钥。

我有一个键可以在 //tei:seg[@type='dep_event']/@corresp 的这些文档中搜索匹配项

所以,我为文档集合声明了一个变量:

 <xsl:variable name="coll" 
    select="collection('file:///Users/username/foopath')"/>

还有一把钥匙:

<xsl:key name="correspidkey" 
     match="tei:seg[@type='dep_event' and @corresp]" 
     use="@corresp"></xsl:key>

然后我按如下方式针对集合部署密钥(拒绝来自self:: 的任何不需要的返回):

  <xsl:variable name="correspvar" 
     select="self::seg[@type='dep_event' and @corresp]/@corresp"/>

  <xsl:value-of select="$coll/(key('correspidkey',$correspvar) 
            except $correspvar)/upper-case(@id)" 
            separator=", "/>
            </xsl:element>
        </xsl:when> 

Saxon HE 9.6.07 返回Content is not allowed in prolog,但我无法确定此错误的确切含义。如果我删除这一行,错误就会消失并且文件处理正常。也许我使用collection() 和密钥?

非常感谢。

【问题讨论】:

  • 您是否从命令行运行 Saxon?或者在任何 Java 代码中?您是否有任何集合解析器应该将您的 URI file:///Users/username/foopath 映射到这些文档?如果您从命令行或 Java 使用普通的 Saxon,则标准解析器使用例如从file:///Users/username/foopath 目录加载所有“*.xml”文件将是collection('file:///Users/username/foopath?select=*.xml')
  • 我正在使用 Oxygen 编写和测试 XSL 和 XML,它最初抛出了错误 - 添加 ?select=*.xml 解决了它。现在我知道撒克逊人不喜欢获取非 XML 或者更确切地说是不可处理的文件。对于 Oxygen 来说,这个过程太大了,所以我把它扔到了命令行中。

标签: xslt xslt-2.0 saxon


【解决方案1】:

错误是因为您对collection() 的调用选择了格式不正确的 XML 文件。您可以 (a) 在集合 URI 中使用 ;select=*.xml 或 (b) 使用 ;on-error=ignore 过滤掉非 XML 文件。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2011-07-23
    • 2016-09-06
    • 1970-01-01
    • 2015-12-15
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多