2

次のような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 も含む何らかの形式で出力する必要があります。したがって、出力は次のようになります {"name":"column 1", "width":"50px"},{"name":"column 2", "width":"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 形式を変更することはできません。

4

2 に答える 2

2

の代わりに:

<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

于 2012-07-05T18:01:43.077 に答える
1

$rowNum の値は、結果ツリー フラグメント (XSLT 2.0 ではドキュメント ノード) です。結果ツリー フラグメント (またはノード) の有効なブール値は常に true です。おそらく、値が整数であると想像したでしょう。しかし、変数を整数に設定するには、次のように書く必要があります

<xsl:with-param name="x" select="position()"/>

いいえ

<xsl:with-param name="x">
  <xsl:value-of select="position()"/>
</xsl:with-param>

悲しいことに、後者の構文は信じられないほど普及しているように見えます。それがいかに冗長で非効率的であり、(ここのように) 間違った答えを返すことがどれほど稀なのかを考えるとです。

于 2012-07-05T22:18:37.313 に答える