使用xsl param作为XPath函数的参数

时间:2014-11-18 03:23:25

标签: xslt xpath arguments param

我一直试图找出一种方法来使用param / variable作为函数的参数。 至少,我希望能够使用基本字符串参数作为参数,如下所示:

 <xsl:param name="stringValue" default="'abcdef'"/>
 <xsl:value-of select="substring(string($stringValue),1,3)"/>

上面的代码没有输出。

我觉得我错过了一种简单的方法。如果xslt 1.0处理器不允许这样做,我很乐意使用exslt或其他扩展。

修改

我正在使用XSL 1.0并使用支持XPATH 1.0的Nokogiri进行转换。这是我想要做的更完整的片段:

我想使用nokogiri将列号作为参数传递如下

document = Nokogiri::XML(File.read('table.xml'))
template = Nokogiri::XSLT(File.read('extractTableData.xsl'))
transformed_document = template.transform(document,
                ["tableName","'Problems'",      #Table Heading
                    "tablePath","'Table'",      #Takes an absolute XPATH String
                    "nameColumnIndex","2",      #column number 
                    "valueColumnIndex","3"])    #column number
 File.open('FormattedOutput.xml', 'w').write(transformed_document)

我的xsl然后想要访问每个TD [valueColumnIndex]并检索该位置的前3个字符,这就是我使用子字符串函数的原因。所以我想做一些事情:

<xsl:value-of select="substring(string(TD[$valueColumnIndex]),1,3)"/>

由于我无法做到这一点,我尝试将TD [$ valueColumnIndex]提取到另一个参数valueCode,然后执行substring(string(valueCode),1,3)

这也不起作用(也就是说,没有输出文字,而<xsl:value-of select="$valueCode"/>给了我预期的输出)。

结果,我决定更好地理解如何使用参数,我只想使用硬编码字符串,如我之前的问题所述。

我尝试过的事情:

使用abcdef(而不是)周围的单引号 在param名称周围使用string()(而不是)

根据以下评论,我似乎无法理解错误,因为Nokogiri没有报告这些情况的错误。我现在正在安装xsltproc并查看是否收到任何错误。

最后,这是我的整个xsl。我使用单独的模板forLoop,因为我正在创建valueCode参数。感兴趣的行是最后5个左右。由于涉及数据使用问题,我无法包含xml。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ext="http://exslt.org/common"
  xmlns:dyn="http://exslt.org/dynamic"
  exclude-result-prefixes="ext dyn">
<xsl:param name="tableName" /> 
<xsl:param name="tablePath" />
<xsl:param name= "nameColumnIndex" />
<xsl:param name= "valueColumnIndex"/>

<xsl:template match="/"> 
  <xsl:param name="tableRowPath">
    <xsl:value-of select="$tablePath"/><xsl:text>/TR</xsl:text>
  </xsl:param>
  <!-- Problems -->
  <section>
    <name>
      <xsl:value-of select="$tableName" />
    </name>
    <!-- <xsl:for-each select="concat($tablePath,'/TR')"> -->
    <xsl:for-each select="dyn:evaluate($tableRowPath)">
      <!-- Encode record section -->
      <xsl:call-template name="forLoop"/>
    </xsl:for-each>
  </section>

</xsl:template>
<xsl:template name="forLoop">
  <xsl:param name="valueCode">
    <xsl:value-of select="./TD[number($valueColumnIndex)][text()]"/>
  </xsl:param>
  <xsl:param name="RandomString" select="'Try123'"/>
 <section>
    <name>
      <xsl:value-of select="./TD[number($nameColumnIndex)]"/>
    </name>
    <code>
      <short>
        <xsl:value-of select="substring(string($valueCode),1,3)"/>
      </short>
      <long>
        <xsl:value-of select="$valueCode"/>
      </long>
    </code>
  </section>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

以这种方式使用:

<xsl:param name="stringValue" select="'abcdef'"/>
<xsl:value-of select="substring($stringValue,1,3)"/>