2014-03-27 36 views
0

XML我有一個文本文件,如下所示:將文本轉換爲使用XSLT

value1 value2 value3 value4

我想將其轉換爲下面的XML使用XSLT

<values> 
    <value>value1</value> 
    <value>value2</value> 
    <value>value3</value> 
    <value>value4</value> 
    </values> 

在此先感謝。

+0

XSLT不招待文本XML轉換。您可以通過其他方式來完成(XML到文本)。 –

+1

@Linhamurthy CS:這個人正在使用Java,那麼爲什麼你假設他/他仍然在XSLT 1.0上?好的,當人們沒有說出哪個版本時,這通常意味着他們沒有意識到差異,但是由於他們需要XSLT 2.0來解決問題,並且可以在他們的環境中使用,所以您的回答稱「無法完成」 「是無益和不正確的。 –

+0

@MichaelKay:謝謝,Dr.Kay ..那是我的無知。我沒有意識到XSLT2.0的這種能力。 –

回答

0

,如果你可以編輯您的輸入,它包含一個根元素,和製表符作爲分隔符,如下面:

<root>value1 value2 value3 value4</root> 

然後,你可以應用以下樣式:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <values> 
      <xsl:call-template name="tokenizeString"> 
       <xsl:with-param name="list" select="."/> 
       <xsl:with-param name="delimiter" select="'&#x9;'"/> 
      </xsl:call-template> 
     </values> 
    </xsl:template> 

    <xsl:template name="tokenizeString"> 
     <!--passed template parameter --> 
     <xsl:param name="list"/> 
     <xsl:param name="delimiter"/> 
     <xsl:choose> 
      <xsl:when test="contains($list, $delimiter)"> 
       <value> 
        <!-- get everything in front of the first delimiter --> 
        <xsl:value-of select="substring-before($list,$delimiter)"/> 
       </value> 
       <xsl:call-template name="tokenizeString"> 
        <!-- store anything left in another variable --> 
        <xsl:with-param name="list" select="substring-after($list,$delimiter)"/> 
        <xsl:with-param name="delimiter" select="$delimiter"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:choose> 
        <xsl:when test="$list = ''"> 
         <xsl:text/> 
        </xsl:when> 
        <xsl:otherwise> 
         <value> 
          <xsl:value-of select="$list"/> 
         </value> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

和農產品:

<values> 
    <value>value1</value> 
    <value>value2</value> 
    <value>value3</value> 
    <value>value4</value> 
</values> 
+1

這是一個XSLT 1.0「解決方案」,它不能解決問題。查看我的回覆以獲得更簡潔,更完整的XSLT 2.0解決方案。 –

+0

@Joel M. Lamsen:假設我想添加不同的節點名稱這些值?我怎樣才能做到這一點。 – Biju

+0

請將此作爲另一個問題發佈,因爲這可能需要不同的解決方案 –

1

假設XSLT 2.0,

<xsl:template name="main"> 
<values> 
    <xsl:for-each select="tokenize(unparsed-text('input.txt'), '\s+')"> 
    <value><xsl:value-of select="."/></value> 
    </xsl:for-each> 
</values> 
</xsl:template>