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 回答