2017-10-28 8 views
0

トークンに基づいて、指定されたxml要素の値を複数の子要素に分割する方法を教えてください。ここに私のサンプル入力XMLと望ましい出力があります。私はxsl 1.0の使用に制限があります。ありがとうございました。文字列XSL 1.0を使用して新しい要素に分割

入力XML:

<?xml version='1.0' encoding='UTF-8'?> 
<SQLResults> 
    <SQLResult> 
     <ACTION1>Action1</ACTION1> 
     <ACTION2>Action2</ACTION2> 
     <Encrypt>Program=GPG;Code=23FCS;</Encrypt> 
     <SENDER>Program=WebPost;Protocol=WS;Path=/home/Inbound</SENDER> 
    </SQLResult> 
</SQLResults> 

出力XML:

<?xml version='1.0' encoding='UTF-8'?> 
<SQLResults> 
    <SQLResult> 
     <ACTION1>Action1</ACTION1> 
     <ACTION2>Action2</ACTION2> 
     <Encrypt> 
      <Program>GPG</Program> 
      <Code>23FCS</Code> 
     </Encrypt> 
     <SENDER> 
      <Program>Action4</Program> 
      <Protocol>WS</Protocol> 
      <Path>/home/Inbound</Path> 
     </SENDER> 
    </SQLResult> 
</SQLResults> 
+0

あなたのXSLT 1.0プロセッサがhttp://exslt.org/str/functions/tokenize/index.htmlをサポートしていないかどうかを最初にチェックし、そうでない場合は、XSLT 1.0テンプレートベースの実装http://exslt.org/str/functions/tokenize/str.tokenize.template.xslを引き続き使用できます。 –

+0

ありがとうございます。私はそれを確認している。あなたが上記の機能を備えたスニペットを指すことができればと感謝します。 – GSR

答えて

1

XSLT 2で、それだけで、以下のテンプレートを使用して、簡単に次のようになります。

<xsl:template match="Encrypt|SENDER"> 
    <xsl:copy> 
    <xsl:analyze-string select="." regex="(\w+)=([\w/]+);?"> 
     <xsl:matching-substring> 
     <element name="{regex-group(1)}"> 
      <xsl:value-of select="regex-group(2)"/> 
     </element> 
     </xsl:matching-substring> 
    </xsl:analyze-string> 
    </xsl:copy> 
</xsl:template> 

ますので、 wあなたは別の方法でそれを表現する必要がありますXSLT 1でそれを行うには、アリ。

代わりのanalyze-stringあなたがする必要があります。

  • トークン化;文字の間に含まれる非空のトークンにコンテンツ。 tokenizeテンプレートを追加する必要があります。
  • 各トークンは、= charの前後に2つの部分文字列に分割されます。
  • 最初の部分文字列と同じ名前の要素を作成します。
  • この要素の内容を書き込みます(2番目の部分文字列)。

XSLT 1tokenizeテンプレート の結果はないノードがセット結果ツリーフラグメント(RTF)であるような制限があるので、それは はXPath式で使用することができません。

この制限を回避するには、exsl:node-set機能を使用する必要があります。

だから、全体のスクリプトは以下のようになります、

まあ
<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Encrypt|SENDER"> 
    <xsl:copy> 
     <xsl:variable name="tokens"> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="txt" select="."/> 
      <xsl:with-param name="delim" select="';'"/> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:for-each select="exsl:node-set($tokens)/token"> 
     <xsl:variable name="t1" select="substring-before(., '=')"/> 
     <xsl:variable name="t2" select="substring-after(., '=')"/> 
     <xsl:element name="{$t1}"> 
      <xsl:value-of select="$t2" /> 
     </xsl:element> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template name="tokenize"> 
    <xsl:param name="txt" /> 
    <xsl:param name="delim" select="' '" /> 
    <xsl:choose> 
     <xsl:when test="$delim and contains($txt, $delim)"> 
     <token> 
      <xsl:value-of select="substring-before($txt, $delim)" /> 
     </token> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="txt" select="substring-after($txt, $delim)" /> 
      <xsl:with-param name="delim" select="$delim" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:when test="$txt"> 
     <token><xsl:value-of select="$txt" /></token> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 

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

ありがとうございます。それは私の仕事をしている。ありがとうございました。 – GSR

関連する問題