2013-04-10 18 views
1

我花了2個小時來尋找在Internet上的工作有所幫助,但我沒有找到任何答案...的<xsl:-的值>不會在模板

我希望你能:)

所以,我的XSLT文件下面(簡化):

<?xml version="1.0" encoding="utf-8" ?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:param name="basename"/> 
    <xsl:param name="purpose"/> 
    <xsl:param name="xml_input_path"/> 
    <xsl:param name="self"/> 

    <xsl:template match="testspec"> 
     <xsl:call-template name="call_commands"/> 
    </xsl:template> 

    <xsl:template name="call_commands"> 
     <xsl:variable name="root" select="document($xml_input_path)/testspec"/> 
     <xsl:for-each select="$root//command"> 
      <xsl:sort select="."/> 
      <xsl:variable name="current" select="."/> 
      <xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="TOTO_short"> 
     <xsl:text>Fonction TOTO :</xsl:text> 
     <xsl:variable name="dda" select="'b'"/> 
     <xsl:copy-of select="$dda"/> 
    </xsl:template> 

    <xsl:template name="TATA_interrupt"> 
       Fonction TATA : 
     <xsl:variable name="v1_name" select="'NaN'"/> 
     <xsl:value-of select="$v1_name" /> 
    </xsl:template> 
</xsl:stylesheet> 

這裏是我的XML輸入:

<testspec> 
    <command label="TOTO_short"/> 
    <command label="TATA_interrupt"/> 
    <command label="TOTO_short"/> 
    <command label="TATA_interrupt"/> 
</testspec> 

我的問題是如下情況:TE mplates TOTO_short和TATA_short,我想定義2個變量並顯示它們的值...

但它不起作用!

你能幫我理解它來自哪裏嗎?

感謝很多提前:)

阿爾諾

+0

你能否修改你的問題並告訴我們你期望的結果XML是什麼樣的? – ABach 2013-04-10 17:14:31

回答

2

問題是與此相當瘋狂的尋找線

<xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/> 

它看起來像你試圖調用命名模板的名稱等於目前的label屬性。但要調用命名模板,您必須使用xsl:call-template。對於當前的XSL:申請模板發現了什麼,你需要一個模板,像這樣:

<xsl:template match="xsl:template[@name='TOTO_short']"> 
    <xsl:call-template name="TOTO_short" /> 
</xsl:template> 

這實在不是去了解事物的方式!您的命名模板似乎可以正常工作的原因是因爲XSLT中的內置模板正在被使用。當它找不到像上面那樣的匹配模板時,它只會輸出元素的文本。

我並不認爲需要這麼複雜的方法。而非目前的xsl:對,每個,你可以簡單地這樣做:

<xsl:apply-templates select="$root//command" /> 

然後你有一個匹配的模板,像這樣:

<xsl:template match="command[@label='TOTO_short']"> 
    <xsl:text>Fonction TOTO :</xsl:text> 
    <xsl:variable name="dda" select="'b'"/> 
    <xsl:copy-of select="$dda"/> 
</xsl:template> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:param name="basename"/> 
    <xsl:param name="purpose"/> 
    <xsl:param name="xml_input_path" select="'C:\Users\Tim Case\Documents\Test.xml'" /> 
    <xsl:param name="self"/> 

    <xsl:template match="testspec"> 
     <xsl:call-template name="call_commands"/> 
    </xsl:template> 

    <xsl:template name="call_commands"> 
     <xsl:variable name="root" select="document($xml_input_path)/testspec"/> 
     <xsl:apply-templates select="$root//command" /> 
    </xsl:template> 

    <xsl:template match="command[@label='TOTO_short']"> 
     <xsl:text>Fonction TOTO :</xsl:text> 
     <xsl:variable name="dda" select="'b'"/> 
     <xsl:copy-of select="$dda"/> 
    </xsl:template> 

    <xsl:template match="command[@label='TATA_interrupt']"> 
       Fonction TATA : 
     <xsl:variable name="v1_name" select="'NaN'"/> 
     <xsl:value-of select="$v1_name" /> 
    </xsl:template> 
</xsl:stylesheet> 

事實上,我不確定爲什麼你在這裏傳遞XML作爲參數的路徑。你可以簡單地將XSLT簡化爲:

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

    <xsl:template match="testspec"> 
     <xsl:apply-templates select="command" /> 
    </xsl:template> 

    <xsl:template match="command[@label='TOTO_short']"> 
     <xsl:text>Fonction TOTO :</xsl:text> 
     <xsl:variable name="dda" select="'b'"/> 
     <xsl:copy-of select="$dda"/> 
    </xsl:template> 

    <xsl:template match="command[@label='TATA_interrupt']"> 
       Fonction TATA : 
     <xsl:variable name="v1_name" select="'NaN'"/> 
     <xsl:value-of select="$v1_name" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

哇。做好解決這樣一個不可逾越的結。 – 2013-04-10 19:46:54

+0

哦,對不起,我沒有回答!非常感謝,它工作! :) – user2266959 2013-05-02 08:35:23

相關問題