2012-03-16 10 views
1

要素の値の一部を抽出し、それを属性として割り当てる必要があります。XSLTでコンテンツの一部を抽出する方法

ソース:

<www> 
     <sss> 
      <eee>XML ELEMENT VALUE 
      [part].HTML element value [HTPART]. 
       HTML element value [HTPART2]. 
      </eee> 
    </sss> 
</www> 

それは何回も来るかもしれない[]角括弧内this.Theコンテンツのように続けます。また、ソースに余分なスペースがたくさんあります。私は余分なスペースを削除し、このようなコンテンツを表示したい。

出力REQ:

 <fff>XML ELEMENT VALUE<ggg name="part"/>.HTML element value<ggg name="HTPART"/>.HTML element value<ggg name="HTPART2"/>. </fff> 

はいずれもこれを行う方法を提案することができます。私はXSLTが初めてです。

ありがとうございます。

+0

は、XSLTを使用すると、使用できる唯一のツールですか?なぜなら、これはXSLTの外でもっと簡単になるからです。 – Tomalak

+0

はい。私はXSLTのみを使用しています。私のタスクはXSLTのみをサポートします。 – Patan

答えて

2

文字列処理はXSLTの強力な側面ではありません。それはXML処理言語です。結局、汎用言語ではありません。

あなたの問題はしかし、再帰によって解決することができます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="eee"> 
    <fff> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="text" select="text()" /> 
     </xsl:call-template> 
    </fff> 
    </xsl:template> 

    <xsl:template name="process"> 
    <xsl:param name="text" select="''" /> 

    <xsl:variable name="head" select="substring-before($text, '[')" /> 
    <xsl:variable name="tag" select="substring-before(substring-after($text, '['), ']')" /> 
    <xsl:variable name="tail" select="substring-after($text, ']')" /> 

    <xsl:choose> 
     <xsl:when test="$head != '' and $tag != ''"> 
     <xsl:value-of select="$head" /> 
     <ggg name="{$tag}" /> 
     <!-- recursive step: process the remainder of the string --> 
     <xsl:call-template name="process"> 
      <xsl:with-param name="text" select="$tail" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

上記テンプレートの出力を、あなたの入力のために:

<fff>XML ELEMENT VALUE 
<ggg name="part"/>.HTML element value <ggg name="HTPART"/>. 
    HTML element value <ggg name="HTPART2"/>. 
</fff> 
関連する問題