【问题标题】:XSL parsing issue for-each tag每个标签的 XSL 解析问题
【发布时间】:2013-02-22 09:57:32
【问题描述】:

我的 XSL 不能使用参数

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="reportname" />
<xsl:param name="quarter" />
<xsl:param name="menteename" />

<xsl:template match="AllReports" >
<xsl:for-each select="./Report[@Name=$reportname]" >
    <table border="0" class="dottedlines" cellpadding="2" cellspacing="0">

    <xsl:for-each select="Record[@Period=$quarter] and ($menteename)] >

<tr>
    <xsl:for-each select="Entry">
 <td><xsl:value-of select="." disable-output-escaping="yes"/></td>
               </xsl:for-each>
</tr>

    </xsl:for-each>
</table>

    </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

我的 XSL 使用硬编码值

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="reportname" />
<xsl:param name="quarter" />
<xsl:param name="menteename" />

<xsl:template match="AllReports" >
<xsl:for-each select="./Report[@Name=$reportname]" >
    <table border="0" class="dottedlines" cellpadding="2" cellspacing="0">

    <xsl:for-each select="Record[@Period=$quarter] and (Entry= 'Dhirde, Govinda' or Entry= 'Vaze, Kedar')] >

<tr>
    <xsl:for-each select="Entry">
 <td><xsl:value-of select="." disable-output-escaping="yes"/></td>
               </xsl:for-each>
</tr>

    </xsl:for-each>
</table>

    </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

我正在传递变量 $menteename = "Entry= 'Dhirde, Govinda' 或 Entry= 'Vaze, Kedar'" 的值。但是硬编码的东西效果很好,而不是参数一。我发现 XSL 解析存在一些问题,即它读取参数值中的标签。这是造成问题的原因吗。我怎样才能做到这一点?

【问题讨论】:

  • 抱歉,在上传代码时,我额外输入了一个结束 ']'。它不适用于 并适用于

标签: xml xslt xml-parsing


【解决方案1】:

变量保存值,而不是表达式。您不能将表达式 lilke (@x = 3) 替换为值为字符串“@x = 3”的变量。要执行此类操作,您需要一个扩展以评估作为字符串提供的 XPath 表达式,例如 saxon:evaluate(),或在 XSLT 3.0 中为 xsl:evaluate。

【讨论】:

    【解决方案2】:

    好吧,我们真的需要知道哪种类型的参数值以及您传递给样式表的值,特别是当您的问题被标记为xslt-2.0 时,您应该有可能传递一个纯字符串值,但作为以及一系列字符串。

    假设你传入一个字符串序列'Dhirde, Govinda', 'Vaze, Kedar',你可以简单地测试

      Entry = $menteename
    

    在你的谓词中。

    如果您传入一个包含多个名称的纯字符串,那么这些字符串当然需要拆分为单独的值。由于值已经包含逗号,因此需要不同的分隔符,例如传入的字符串值为'Dhirde, Govinda|Vaze, Kedar',您可以使用

    Entry = tokenize($menteename, '\|')
    

    在你的谓词中。

    假设您使用 XSLT 1.0 并且不能使用或不想使用扩展函数来拆分参数的字符串值,您可以使用类似检查

    contains(concat('|', $menteename, '|'), concat('|', Entry, '|'))
    

    这假设 Entry 元素包含一个像 Vaze, Kedar 这样的单个值,并且您传入一个 bar 分隔的名称列表,例如'Dhirde, Govinda|Vaze, Kedar' 作为参数值,那么检查就可以了

    contains('|Dhirde, Govinda|Vaze, Kedar|', '|Vaze, Kedar|')
    

    【讨论】:

    • 我的建议是 XPath/XSLT 2.0,您需要使用 XSLT 2.0 处理器,如 Saxon 9 或 AltovaXML 或 XmlPrime。该错误消息听起来好像您在仅支持 XSLT 1.0 的 Mozilla 浏览器(如 Firefox)中使用 XSLT。所以你首先需要明确你想使用哪个 XSLT 处理器分别是哪个 XSLT 版本。
    • 我正在使用 XSLT 1.0。你能帮我解决这个问题吗
    • 在 XSLT 1.0 中,您有两个选择,如果您的 XSLT 处理器支持,则使用扩展功能,或者使用像 contains(concat('|', $menteename, '|'), Entry) 这样的检查。除了这条评论,我将编辑我的帖子并在帖子中显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2023-03-17
    • 2017-06-07
    • 2011-01-02
    • 2013-11-11
    相关资源
    最近更新 更多