我一直试图找出一种方法来使用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>
答案 0 :(得分:0)
以这种方式使用:
<xsl:param name="stringValue" select="'abcdef'"/>
<xsl:value-of select="substring($stringValue,1,3)"/>