2016-04-17 15 views
2

私はXML、このようなものがあります:XSLT変化値ノード

<?xml version="1.0" encoding="UTF-8"?> 
     <earth> 
    <computer> 
      <parts> 
       <cpu>AMD;fast</cpu> 
       <video>GF</video> 
       <power>slow</power> 
       ...others 
      </parts> 
      <owner> 
      <name>Frank</name> 
      <owner> 
      </computer> 

    <earth> 

私は、XSLは(XSL変換を作成します:スタイルシートのバージョン= "2.0" のxmlnsを:XSLを= "HTTP ://www.w3.org/1999/XSL/Transform ")。私の予想される結果は、cpuにサインがある場合のみ ';' - ';'がなければ、 ';'の後の値に変更する必要があります。結果は何の変化

<earth> 
<computer> 
     <parts> 
      <cpu>AMD</cpu> 
      <video>GF</video> 
      <power>fast</power> 
      ...others 
     </parts> 
     <owner> 
      <name>Frank</name> 
     <owner> 
     </computer> 
<earth> 

はこのような何かをしてみないはずですが、運:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    exclude-result-prefixes="fn"> 
    <xsl:output encoding="utf-8" method="xml" indent="yes" /> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="parts"> 
     <xsl:choose> 
      <!-- try test if node name equals 'power' if equals them try make logic 
       here, this dont work--> 
      <xsl:when test="name() = 'power'"> 
       <xsl:variable name="text" select="./cpu" /> 
       <xsl:variable name="sep" select="';'" /> 
       <xsl:variable name="powerTable" select="tokenize($text, $sep)" /> 
       <xsl:value-of select="$powerTable[1]" /> 
      </xsl:when> 
      <!--if not 'power' copy node --> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:apply-templates select="@* | node()" /> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 
+1

* "私はXMLスタイルシートを持っています" *。どのように見えるか分かりますか?これまでに投稿されたものは* XML * – har07

+0

私の投稿を編集すると、XMLファイルがあり、このファイルを新しいxmlファイルに変換するためにxslを作成する必要があります。 – Wait

+0

これまでにXSLTを作成しようとしましたか?お持ちの場合は、それを共有して、どの部分が期待どおりに動作していないのか、どの部分を実装するのか分からないことを説明してください。まだ読んでいない場合は、XSLT入門チュートリアルを読んでから、自分で最初に作成してみてください。がんばろう! – har07

答えて

0

私はこれを達成するために、次のテンプレートを使用します。

<xsl:template match="parts[contains(cpu,';')]/power"> 
    <power> 
     <xsl:value-of select="../cpu/substring-after(.,';')"/> 
    </power> 
</xsl:template> 

<xsl:template match="cpu[contains(.,';')]"> 
    <cpu> 
     <xsl:value-of select="substring-before(.,';')"/> 
    </cpu> 
</xsl:template> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
</xsl:template> 

最初のテンプレートはと一致しませんpowerpartsparts/power)の子要素であり、partsには、;parts[contains(cpu,';')])を含む子要素cpuがあります。このテンプレートは、文字;の後に、cpu要素値の値を持つpower要素を出力します。

2番目のテンプレート、文字;前に、文字;、および初期値と出力cpu要素が含まれていcpu要素にマッチします。

他のテンプレートは、あなたが目的を知っていると思っているアイデンティティーテンプレートです。

+0

ありがとうございます。それは素晴らしい作品 – Wait

関連する問題