1

私はXSLにまったく慣れておらず、テンプレートを使用してXMLファイルからノードを動的に参照しようとしています。

もう少し情報を提供するために、Cast Ironを使用して初期XMLを生成すると、複数の結果セットが返されます。その中には、複数の行を持つものもあります。サンプルXMLは次のとおりです。

<resultSets>
    <resultSet/>
    <resultSet>
      <row>
        <column1>1</column1>
        <column2>Hello</column2>
      </row>
    </resultSet>
    <resultSet>
      <row>
        <column1/>
      </row>
      <row>
        <column1/>
      </row>
    </resultSet>
</resultSets>

だから私はこれをお客様が使えるものに変えようとしています。生活を楽にするために、いくつかの入力を含むテンプレートを使用することを考えました。

結果セットの番号、行の番号、および列の名前を入力することで、データを参照するテンプレートを設計したかったのです。問題は、それを参照すると、結果のノードが作成されないことです。だから私の質問は:ParamをXmlノードとして参照するにはどうすればよいですか?

これが私がテンプレートのために持っているものです:

<xsl:template name="getData">
    <xsl:param name="resultset" select="0" />
    <xsl:param name="position" select="0" />
    <xsl:param name="column-name" select="''" />
    <!-- Checking to see if Parameters were passed in.  This seems to work correctly -->
    <xsl:if test="($resultset &gt; 0)and($position &gt; 0)and($column-name != '')">
        <!-- Check to see if there are any rows in the resultSet.  This seems to work correctly -->
        <xsl:if test="count(//resultSets/resultSet[position() = $resultset]/row[position() = $position]) &gt; 0">
            <!-- This part fails; nothing is referenced --> 
            <xsl:value-of select="//resultSets/resultSet[position() = $resultset]/row[position() = $position][@name = $column-name]"/>
        </xsl:if>
    </xsl:if>
</xsl:template>

これが私がそれを参照しようとしている方法です(例として):これはXMLファイルから「Hello」を返すはずです(そうではありませんか?)

<xsl:element name="SampleElement">
 <xsl:call-template name="getData">
  <xsl:with-param name="resultset" select="2" />
  <xsl:with-param name="position" select="1" /> 
  <xsl:with-param name="column-name" select="'column2'" />
 </xsl:call-template>
</xsl:element>

質問が不明な場合や以前に質問されたことがある場合は、申し訳ありませんが、何も見つかりませんでした。

4

1 に答える 1

1

単に使用してください:

<xsl:value-of select=
  "/*/resultSet[position()=$resultset]
        /row[position()=$position]
          /*[name()=$column-name]"/>

XPathのインデックス作成は1ベースであり、0ベースではないことに注意してください。

完全な変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:param name="pResSetNo" select="2"/>
  <xsl:param name="pRowNo" select="1"/>
  <xsl:param name="pColName" select="'column2'"/>


    <xsl:template match="/">
      <xsl:copy-of select=
      "/*/resultSet[position()=$pResSetNo]
        /row[position()=$pRowNo]
          /*[name()=$pColName]"/>
    </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<resultSets>
    <resultSet/>
    <resultSet>
      <row>
        <column1>1</column1>
        <column2>Hello</column2>
      </row>
    </resultSet>
    <resultSet>
      <row>
        <column1/>
      </row>
      <row>
        <column1/>
      </row>
    </resultSet>
</resultSets>

必要な正しい結果が生成されます:

Hello
于 2012-09-21T15:06:48.080 に答える