每个标记的XSL解析问题

时间:2013-02-22 09:57:32

标签: xml xslt xml-parsing

我的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解析存在一些问题,即它在参数值中读取标记。这是否会导致问题。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

我们确实需要知道哪种类型的参数值以及传递给样式表的值,特别是当您的问题被标记为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|')

答案 1 :(得分:0)

变量包含值,而不是表达式。您不能将表达式lilke(@x = 3)替换为值为字符串“@x = 3”的变量。要做这种事情,你需要一个扩展来评估作为字符串提供的XPath表达式,例如saxon:evaluate(),或者在XSLT 3.0 xsl:evaluate中。