2017-02-03 5 views
0

私はフォーマットしたいXMLファイルを持っていますが、少し助けが必要です。XSLT 1.0区切り文字列をノードに変換する

私の入力がある:私はに私の入力をオンXSLを構築する必要があります

<X> 
    <Y> 
     <id>2047866</id> 
     <email_address>[email protected]</email_address> 
     <senddate>2017-02-02 15:13:27.0941121</senddate> 
     <product_id>5000231;5000233;5000237;5000240;5000240;5000241;</product_id> 
    </Y> 
</X> 

<X> 
    <Y> 
     <id>2047866</id> 
     <email_address>[email protected]</email_address> 
     <senddate>2017-02-02 15:13:27.0941121</senddate> 
     <product_id>5000231</product_id> 
    </Y> 
    <Y> 
     <id>2047866</id> 
     <email_address>[email protected]</email_address> 
     <senddate>2017-02-02 15:13:27.0941121</senddate> 
     <product_id>5000233</product_id> 
    </Y> 
    etc 
    . 
    . 
</X> 

私は私がPRODUCT_IDから各IDを取ることができますスクリプトを見つけましたが、私はする必要がありそれぞれのproduct_idのid、email、senddateもコピーしてYの親タグに入れてください。

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:variable name="delimiter"> 
    <xsl:text>;</xsl:text> 
</xsl:variable> 

<xsl:template match="mark"> 
    <xsl:variable name="dataList"> 
     <xsl:value-of select="."/> 
    </xsl:variable> 
    <xsl:call-template name="processingTemplate"> 
     <xsl:with-param name="datalist" select="$dataList"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="processingTemplate"> 
    <xsl:param name="datalist"/> 
    <xsl:choose> 
     <xsl:when test="contains($datalist,$delimiter) "> 
      <xsl:element name="processedItem"> 
       <xsl:value-of select="substring-before($datalist,$delimiter)"/> 
      </xsl:element> 
      <xsl:call-template name="processingTemplate"> 
       <xsl:with-param name="datalist" select="substring-after($datalist,$delimiter)"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:when test="string-length($datalist)=1"> 
      <xsl:element name="processedItem"> 
       <xsl:value-of select="$datalist"/> 

      </xsl:element> 
     </xsl:when> 
    </xsl:choose>  
</xsl:template> 

あなたは私の続行する方法についていくつかのヒントを与えてもらえますか?

ありがとうございました!

答えて

0

このようにそれを試してみてください。

XSLT 1.0

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

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

<xsl:template match="Y"> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="text" select="product_id"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="';'"/> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:if test="$token"> 
      <xsl:copy> 
       <xsl:apply-templates select="id | email_address | senddate"/> 
       <product_id> 
        <xsl:value-of select="$token"/> 
       </product_id> 
      </xsl:copy> 
     </xsl:if> 
     <xsl:if test="contains($text, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
関連する問題