xml - xslt 将位置作为参数传递会产生奇怪的结果?

标签 xml xslt xpath position

我有一个如下所示的 xml 文件:

<section>
  <title> title of section </title>
  <table>
     <title> title of table</title>
     <tableData columns = 2>
     <column width ="50"/>
     <column width ="100"/>
     <tableHead>
        <row>
             <entry>column 1</entry>
        </row> 
        <row>
             <entry>column 2</entry>
        </row>
     </tableHead>
     <tableBody>
       <row>
             <entry>text</entry>
             <entry>abc</entry>
       </row> 
       <row>
             <entry>text</entry>
             <entry>dbe</entry>
      </row> 
       <row>
             <entry>text</entry>
             <entry>fgh</entry>
       </row> 
     </tableBody>
   </table>
 </section>

我需要处理 tableHead/row/entry 中的每个条目,并以某种格式吐出它,其中还包括列宽度。所以,我的输出必须看起来像 {“名称”:“第 1 列”,“宽度”:“50 像素”},{“名称”:“第 2 列”,“宽度”:“100 像素”}

我的变换看起来像这样

 <xsl:template match="//table/tableHead/row/entry">
    <xsl:text>{"name": "</xsl:text><xsl:value-of select"."/>
    <xsl:text>", "width":"</xsl:text>

    <xsl:call-template name="get_column_width">
       <xsl:with-param name ="rowNum">
          <xsl:value-of sellect"position()"/>
       </xsl:with-param>
    </xsl:call-template>
  </xsl:template>


 <xsl:template name ="get_column_width">
     <xsl:param-name="rowNum">
     <xsl:value-of select="../../../columnWidth[$rowNum]/@width"/>
     <xsl:text>px"}</xsl:text>
 </xsl:template>

奇怪的是,这会产生 {"name":"column 1", "width":"50 100px"},{"name":"column 2", "width":"50 100px"}

但是,当我仅输出 rowNum 参数时,我得到的正是我所期望的:

{"名称":"第 1 列", "宽度":1px"},{"名称":"第 2 列", "宽度":"2px"}

因此,rowNum 是 1 和 2,因此 select 语句将使用 columnWidth[1] 和 columnWidth[2],但无论出于何种原因,它只输出这两个值。我尝试在选择中使用columnWidth[1],它按照我的预期输出 50。 columnWidth[2] 输出 100。我在这里真的很困惑。使用前同级给出了相同的结果。我的模板匹配有问题吗?

遗憾的是,无法更改 xml 格式。

最佳答案

代替:

<xsl:value-of select="../../../columnWidth[$rowNum]/@width"/>

使用:

<xsl:value-of select="../../../columnWidth[position() = $rowNum]/@width"/>

说明

在 XPath 中:

someExpression[someInteger]

是以下内容的简写:

someExpression[position() = someInteger]

但是,如果:

someExpression[$someVariableReference]

XPath 1.0 处理器通常不知道变量中包含什么值和什么类型。因此,它会将此变量转换为 bool 值(true()false())以执行完整的评估。

根据定义:

boolean(someNumber)

相当于:

not(somenumber = 0)

由于数字 1 和 2 都不为零,因此谓词 [$rowNum] 在这两种情况下都是 true()

因此:

../../../columnWidth[$rowNum]/@width

选择两个 columnWidth 元素的 width 属性。

关于xml - xslt 将位置作为参数传递会产生奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349800/

相关文章:

XSLT - 匹配谓词中的变量元素

java - 通过 XPath 获取 HTML 元素的子元素

xml - 选择值小于某个数字的元素

java - 使用java更改xml标签的值

javascript - 使用 Javascript 向后循环 XML

xml - 如何使用 XSLT 制作 xml 节点子节点的精确副本?

ios - Swift xpath 搜索返回字符串

java - 使用 java 解析器删除 XML 节点

java - 使用 XSLT 打印 XML 元素内的一组键值对数据

javascript - 如何使用 Ajax 按用户提供的值搜索 xml 文档