2017-06-13 4 views
0

XSLTの初心者です。以下のようなCSVファイルから変換されたXMLがあります。値。彼らは皆、自身がfollowing.Iを格納するため使用して、変数「タイプ」を格納する変数を使用してみましたように私は結果を見てみたいxslt変換を使用して別のxmlのヘッダとフッタを使用してxslを変換するxmlを作成する

のみ文字列値で、同じレコードタグと
<?xml version="1.0" encoding="utf-8"?> 
<Items> 
<Row> 
    <Transaction>Open</Transaction> 
</Row> 
<Row> 
    <Transaction>Type plus</Transaction> 
</Row> 
<Row> 
    <Transaction>A</Transaction> 
</Row> 
<Row> 
    <Transaction>B</Transaction> 
</Row>  
<Row> 
    <Transaction>Close</Transaction> 
</Row> 
<Row> 
    <Transaction>Open</Transaction> 
</Row> 
<Row> 
    <Transaction>Type minus</Transaction> 
</Row> 
<Row> 
    <Transaction>C</Transaction> 
</Row> 
<Row> 
    <Transaction>D</Transaction> 
</Row>  
<Row> 
    <Transaction>Close</Transaction> 
</Row> 
... 
... 
... 
... 
... 
</Items> 

を区別して を来りますプラスまたはマイナスですが、変数を更新できないようです。誰もが次への変換を行うことができるxslを作成できますか?

<?xml version="1.0" encoding="utf-8"?> 
<result> 
<message> 
    <to>plus</to> 
    <from>A</from> 
</message> 
<message> 
    <to>plus</to> 
    <from>B</from> 
</message> 
<message> 
    <to>minus</to> 
    <from>C</from> 
</message> 
<message> 
    <to>minus</to> 
    <from>D</from> 
</message> 
... 
... 
... 
</result> 
+1

Saxon 9、XmlPrime、AltoなどのXSLT 2.0プロセッサを使用できますかバ? –

+1

また、出力がルート要素のないいくつかの最上位の 'message'要素の断片であることも本当に望みますか? –

+1

整形式のXML入力スニペットを表示すると、現在のところそのすべての 'Transaction'要素が正しく閉じられていない場合にも役立ちます。 –

答えて

1

この例はあいまいです。私たちがここに必要なのは明確なルールです。

我々は<Transaction>Open</Transaction>始まる Sの各グループでは、第2 は種類が含まれており、最後の1がグループを閉じて、私たちにできることを前提とした場合:

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="*"/> 

<xsl:key name="grp" match="Row[not(Transaction='Open')]" use="generate-id(preceding-sibling::Row[Transaction='Open'][1])" /> 

<xsl:template match="Items"> 
    <result> 
     <xsl:for-each select="Row[Transaction='Open']"> 
      <xsl:variable name="group" select="key('grp', generate-id())" /> 
      <xsl:variable name="type" select="substring-after($group[1]/Transaction, 'Type ')" /> 
      <xsl:for-each select="$group[position() != 1 and position() != last()]">    
       <message> 
        <to> 
         <xsl:value-of select="$type"/> 
        </to> 
        <from> 
         <xsl:value-of select="Transaction"/> 
        </from> 
       </message> 
      </xsl:for-each> 
     </xsl:for-each> 
    </result> 
</xsl:template> 

</xsl:stylesheet> 

取得する:

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <message> 
    <to>plus</to> 
    <from>A</from> 
    </message> 
    <message> 
    <to>plus</to> 
    <from>B</from> 
    </message> 
    <message> 
    <to>minus</to> 
    <from>C</from> 
    </message> 
    <message> 
    <to>minus</to> 
    <from>D</from> 
    </message> 
</result> 
+0

お送りいただきありがとうございます@ michael.hor257k。あなたは私が必要とするソリューションに非常に近いです。私はXMLにいくつかの情報を追加するのを忘れてしまった。 「with」というトランザクションタグ付きの行は、openingを示す他のテキストを含みますが、「open」部分文字列の位置は常に同じです。 close substringとのトランザクションのためにSimalarly substring(Transaction、4,4)のようなものを探すRow [not(Transaction = 'Open')]のように考える –

+0

代わりに 'substring(Transaction、4)= 'Open''を使うトランザクション= 'オープン'の –

+0

恐ろしい!おかげさまで@ michael.hor257kあなたは欲求不満のトンを救った、これを理解しようとしている長い時間。 –

関連する問題