2012-09-21 145 views
1

我對XSL相當陌生,我試圖使用模板從XML文件動態引用節點。XSL動態節點參考

爲了提供更多信息,我使用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文件恢復「你好」(不該」那麼它呢?)

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

對不起,如果我的問題不清楚或之前已經問過,我什麼也沒找到。

+0

您的行元素沒有@name屬性 –

回答

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 
+0

它工作得很好,謝謝! – Gobbledigook

+0

@Gobbledigook,不客氣。 –