我有一个看起来像这样的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中的每个条目,并以也包括columnWidth的某种格式将其吐出。因此,我的输出必须看起来像
{“名称”:“列1”,“宽度”:“ 50px”},{“名称”:“列2”,“宽度”:“ 100px”}

我的变换看起来像这样

 <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],但是出于某种原因,它只会输出它们两者。我尝试在select中使用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处理器通常不知道变量中包含什么值和什么类型。因此,它将此变量转换为布尔值(true()false())以执行完整的评估。

根据定义:

boolean(someNumber)


等效于:

not(somenumber = 0)


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

从而:

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


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

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

10-09 17:23