2011-04-06 102 views
1

我想根據xslt的xml文件中的字段生成html輸出。我根據XMLXSLT換行符問題

祖父母父母與子女,孫子女關係。例如他們的名字:

<root> 
    <node1> 
     <node2> 
     <node3>Data</node3> 
     </node2> 
    </node1> 

我需要的是創造什麼讓我們說文本框,用名稱node1__node2__node3 我到目前爲止是這樣的

<input type="text" name="node1__ 
     node2__ 
     node3__" 

但我想要的是:

<input type="text" name="node1__node2__node3__"/> 

所以它沒用。我的XSLT來產生這種無用的輸出爲:

<xsl:template name="chooseNameID"> 
    <xsl:param name="currentNode"/><!-- in this case currentNode is node3 --> 
    <xsl:variable name="fieldNames"> 
     <xsl:for-each select="$currentNode/ancestor::*"> 
       <xsl:value-of select="name(.)"/>__ 
     </xsl:for-each> 
    </xsl:variable> 

    <xsl:attribute name="name"> 
     <xsl:value-of select="$fieldNames"/>        
    </xsl:attribute> 

</xsl:template> 

我想這個問題是在<xsl:value-of但我無法找到任何解決辦法了這一點。

感謝

+0

好問題,+1。查看我的答案,獲得完整,簡短和簡單的解決方案。 :) – 2011-04-06 13:46:22

回答

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node3"> 
    <xsl:variable name="vName"> 
    <xsl:for-each select= 
     "ancestor-or-self::*[not(position()=last())]"> 
     <xsl:value-of select="name()"/> 
     <xsl:if test="not(position()=last())">__</xsl:if> 
    </xsl:for-each> 
    </xsl:variable> 

    <input type="text" name="{$vName}"/> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<root> 
    <node1> 
     <node2> 
      <node3>Data</node3> 
     </node2> 
    </node1> 
</root> 

產生想要的,正確的結果:

<input type="text" name="node1__node2__node3"/> 

請注意:使用AVT(屬性值模板)在一條短線中生成所需的輸出。

0

爲正常,問一個問題後,你找到一個解決方案。

更改<xsl:value-of select="$fieldNames"/><xsl:value-of select="normalize-space($fieldNames)"爲我工作。

+1

這將仍然在結果中留下空格,因爲normalize-space()將用一個空格替換每個內部空白序列的空格。 – 2011-04-06 14:45:28

+0

你說得對。我只是錯過了空間。 – savruk 2011-04-06 14:49:47

1

不需要的空白,包括換行符,是循環中文本節點文字的一部分。

在樣式表文檔中,除了在xsl:text之內,只有空白的文本節點被忽略。但是,與其他文本相鄰的空格是該文本的一部分。

樣式表中的文字空白可以使用xsl:text進行管理。

<!-- change this --> 
    <xsl:for-each select="$currentNode/ancestor::*"> 
     <xsl:value-of select="name(.)"/>__ 
    </xsl:for-each> 

    <!-- to this --> 
    <xsl:for-each select="$currentNode/ancestor::*"> 
     <xsl:value-of select="name(.)"/>__<xsl:text/> 
    </xsl:for-each> 

    <!-- or this --> 
    <xsl:for-each select="$currentNode/ancestor::*"> 
     <xsl:value-of select="name(.)"/> 
     <xsl:text>__</xsl:text> 
    </xsl:for-each> 
+0

+1正確的解釋。 – 2011-04-06 17:28:36