【问题标题】:XSLT takes escape sequences as parameterXSLT 将转义序列作为参数
【发布时间】:2017-02-17 10:18:17
【问题描述】:

您好,我有一个样式表,它采用来自ant xslt task 的参数。但是参数中充满了转义序列,例如<tag-name>等... 这是参数$fileset-xml: link 的原始表示,它是这个的直接输出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="fileset-xml"/>
    <!--  -->
    <!--  -->
    <xsl:template match="/theRoot">
        <root>
            <xsl:value-of select="$fileset-xml"/>
        </root>
    </xsl:template>
    <!-- -->
    <!-- -->
</xsl:stylesheet>

我的意图是使用该参数生成 xml 格式的输出,但函数 saxon:parse($fileset-xml) 不喜欢这种格式的参数。我想如果我们用它们的渲染值替换转义字符,我会得到一个有效的 xml 文件,但是怎么做呢?

处理器是saxonb9-1-0-8j

EDITION_1

作为@MartinHonnen 评论的附录:

处理器:

&lt;classpath location="../../infrastructure/SaxonEE9-7-0-11J/saxon9ee.jar:/net.sf.saxon.TransformerFactoryImpl"/&gt;

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="fileset-xml"/>
    <xsl:variable name="file-set-xml" select="parse-xml(parse-xml-fragment('&lt;a/&gt;'))"/>
    <!--  -->
    <!--  -->
    <xsl:template match="/theRoot">
        <root>
            <xsl:copy-of select="$file-set-xml"/>
        </root>
    </xsl:template>
    <!-- -->
    <!-- -->
</xsl:stylesheet>

还有错误:

[xslt] : Fatal Error! Error checking type of the expression 'funcall(parse- xml-fragment, [literal-expr(<a/>)])'. Cause: Error checking type of the expressi on 'funcall(parse-xml-fragment, [literal-expr(<a/>)])'.

【问题讨论】:

  • 那么saxon:parse($fileset-xml) 到底是哪条错误消息?
  • 该错误消息并非来自撒克逊人。上一个问题在这里报告了一个非常相似的错误消息:stackoverflow.com/questions/15812382/… 问题在于用户实际上正在运行 Xalan。

标签: xslt saxon


【解决方案1】:

如果您以&amp;lt;a/&amp;gt;(10 个字符)的形式提供字符串,那么 XPath 函数 parse-xml-fragment() 会将其转换为字符串 &lt;a/&gt;(4 个字符),如果您应用 parse-xml()(或 @ 987654325@) 到这个 4 字符的字符串,你会得到一个节点树,其中包含一个名为“a”的空元素。

所以你需要解析两次数据。

【讨论】:

  • Kau 你的意思是作为参数应用?因为当我将它作为参数应用时,我得到了一个错误。
  • @Hairi,你能切换到 Saxon 9.7 和 version="3.0" 吗?然后做parse-xml(parse-xml-fragment($fileset-xml)) 应该工作。我不记得 Saxon B 9.1 是否有一个扩展函数来解析片段字符串,你需要在第一个解析步骤中使用它)
  • @Michael Kay 我可以但是我不能使用saxon:parse 从字符串中获取节点集:(
  • @Hairi,如果您切换到 Saxon 9.7(任何版本)并在 XSLT 中设置 version="3.0",那么您不需要扩展函数,而是可以使用标准 XPath 函数 parse-xml(parse-xml-fragment($fileset-xml))
  • @MartinHonnen 请查看已编辑的原始帖子。仍然出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多