为什么我总是从数组变量中获取第一项?

Why i always get first item from array-variable?

提问人:Alexandr Kruzer 提问时间:10/26/2022 更新时间:10/27/2022 访问量:49

问:

$headerTitles有 4 个值,但我总是收到带有“1”索引的值......为什么?

`<xsl:variable name="tgroup" select="../../.."/>
    <xsl:variable name="colspecs" select="$tgroup/colspec"/>
    <xsl:variable name="headerTitles" select="$tgroup/thead/row/entry"/>

    <xsl:variable name="columnNumber">
      <xsl:call-template name="entry.getColspecAttributeValue">
        <xsl:with-param name="colspecs" select="$colspecs" />
        <xsl:with-param name="attrName">colNum</xsl:with-param>
        <xsl:with-param name="isLastEmpty">false</xsl:with-param>
      </xsl:call-template>
    </xsl:variable>

    <xsl:attribute name="columnName">
      **<xsl:value-of select="$headerTitles[$columnNumber]"/>**
    </xsl:attribute>`

$headerTitles有 4 个值,但我总是收到带有“1”索引的值......为什么?

HTML xslt xhtml xslt-1.0 xls

评论

0赞 Siebe Jongebloed 10/26/2022
如果第一个标题行中有 4 个条目,$headerTitles将指向 4 个条目。在你展示的逻辑中,不清楚$columnNumber将具有哪个值。但是从您的问题来看,我想它将永远是值为 1 的列

答:

1赞 michael.hor257k 10/26/2022 #1

-- 根据评论进行编辑 --

$headerTitles有 4 个值,但我总是收到带有“1”索引的值......为什么?

如果指令:

<xsl:value-of select="$headerTitles[3]"/>

返回第 3 个条目的字符串值,但是:

<xsl:value-of select="$headerTitles[$columnNumber]"/>

返回第一个条目中的值,则变量不包含数字 3。相反,它包含一些值,当计算为布尔值时,所有条目都返回 true(这甚至可以是字符串)。$columnNumber"3"

在这种情况下,XSLT 1.0 中的指令将返回所选节点集中第一个节点的字符串值 - 请参阅:
https://www.w3.org/TR/1999/REC-xslt-19991116/#value-of
https://www.w3.org/TR/1999/REC-xpath-19991116/#section-String-Functions
xsl:value-of

评论

0赞 Alexandr Kruzer 10/26/2022
那么,例如,我如何通过索引 3 获取值呢?
0赞 michael.hor257k 10/26/2022
<xsl:value-of select="$headerTitles[3]"/>应返回第 3 个条目的字符串值。如果您得到不同的结果,请编辑您的问题并提供一个最小的可重现示例
0赞 Alexandr Kruzer 10/26/2022
是的,我得到了第三个条目。但是我需要从我的可变<xsl:variable name=“columnNumber”中获取索引值>
0赞 michael.hor257k 10/26/2022
如果不了解变量的填充方式,我无法帮助您。如果未返回第 3 个条目中的值,则不包含数字 3。<xsl:value-of select="$headerTitles[$columnNumber]"/>$columnNumber
0赞 Martin Honnen 10/27/2022 #2

在 XSLT 1 中,使用变量声明

<xsl:variable name="columnNumber">
  <xsl:call-template name="entry.getColspecAttributeValue">
    <xsl:with-param name="colspecs" select="$colspecs" />
    <xsl:with-param name="attrName">colNum</xsl:with-param>
    <xsl:with-param name="isLastEmpty">false</xsl:with-param>
  </xsl:call-template>
</xsl:variable>

变量的值是包含调用返回的任何内容的结果树片段,因此它是一个结果树片段,可能包含带有数字的文本节点。columnNumberxsl:call-template

在谓词内部,作为结果树片段,它不是位置谓词,而只是一个布尔谓词,其计算结果始终为 true,因为任何结果树片段在布尔上下文中的计算结果为 true。<xsl:value-of select="$headerTitles[$columnNumber]"/>columnNumber

因此,您需要使用或确保根据位置进行选择。<xsl:value-of select="$headerTitles[number($columnNumber)]"/><xsl:value-of select="$headerTitles[position() = $columnNumber]"/>