2016-07-13 6 views
2

私は自分のXML文書をXSLTを使って別のXML構造に変換しようとしています。XSLT(XML入力)を使用した動的要素名によるXML構造の作成

はここに私の入力XMLです:

<?xml version="1.0" encoding="UTF-8"?> 
<ProcessData> 
<FTPRemoteHost>RACHEL</FTPRemoteHost> 
    <CodeListValues> 
    <BCBSRI_FTP_GET> 
     <PARM>CD</PARM> 
     <VALUE>/Desktop/Rachel</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>FTPProfileName</PARM> 
     <VALUE>1234567890</VALUE> 
     <DTM>yyyyMMdd</DTM> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>FileName1</PARM> 
     <VALUE>Rachel.txt</VALUE> 
     <DTM>yyyyMMdd</DTM> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>MV/DEL</PARM> 
     <VALUE>MOVE</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    <BCBSRI_FTP_GET> 
     <PARM>SFG_MBX</PARM> 
     <VALUE>/inbox/Rachel</VALUE> 
     <DTM/> 
    </BCBSRI_FTP_GET> 
    </CodeListValues> 
</ProcessData> 

私はここに見られる多くのさまざまなソリューションを試みたが、私はそれが望むように表示されるように私の構造を取得できませんよ。ここに私のXSLTは、これまでのところです:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/"> 
    <table> 
     <xsl:for-each select="ProcessData/CodeListValues"> 
     <xsl:for-each select="BCBSRI_FTP_GET"> 
      <xsl:value-of select="PARM"/> 
      <xsl:value-of select="VALUE"/> 
      <xsl:value-of select="DTM"/> 
     </xsl:for-each>  
     </xsl:for-each> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 

は、私は次のパターンに従うように出力を必要とする:

あなたが含む、 PARM要素から指定した名前を持つ要素を作成したいように見えます
<CD>/Desktop/Rachel</CD> 
<FTPProfileName>1234567890</FTPProfileName> 
<DTM>yyyyMMdd</DTM> 
<FileName1>Rachel.txt</FileName1> 
<DTM>yyyyMMdd</DTM> 
<MV/DEL>MOVE</MV/DEL> 
<SFG_MBX>/inbox/Rachel</SFG_MBX> 

答えて

1

VALUEの値。 /は、要素名に有効でない、ので<MV/DEL>が有効なXMLではありませんので、これを行うには、あなたが

<xsl:element name="{PARM}"> 
    <xsl:value-of select="VALUE"/> 
</xsl:element> 

しかしxsl:element要素を使用することができ、あなたは正確な結果にあなたの要求を取得することができなくなります素子。 /を有効なものに変換する必要がありますか? (これは-/を変更)

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

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <table> 
     <xsl:for-each select="ProcessData/CodeListValues"> 
     <xsl:for-each select="BCBSRI_FTP_GET"> 
      <xsl:element name="{translate(PARM, '/', '-')}"> 
       <xsl:value-of select="VALUE"/> 
      </xsl:element> 
      <xsl:copy-of select="DTM[normalize-space()]"/> 
     </xsl:for-each>  
     </xsl:for-each> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 

は、あなたの質問にごXSLTであなたが/に一致する2つのテンプレートを持っていることに注意してくださいかかわら

は先発のために、このXSLTを試してみてください。これはXSLTのエラーとみなされ、2つのテンプレートが同じ優先順位で同じものに一致するようにします。 XSLTはエラーにフラグを立てるか、最後のテンプレート以外のすべてを無視するかもしれません。

xsl:copy-ofxsl:value-ofの違いにも注意してください。 xsl:copy-ofを使用すると、ノード全体がコピーされますが、xsl:value-ofはそのノードの文字列値を出力します。

関連する問題