2017-05-02 17 views
0

xsltを使用してxmlファイルに値を追加しようとしています。 だから基本的に私はこのXMLファイル1.xml2番目のxmlファイルのデータを使用してxmlノードに値を追加する(マージ)

<?xml version="1.0" encoding="UTF-8"?> 
<Orderfile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    <order> 
    <establishmenthour>10:38:00</ establishmenthour> 
    <ExpirationDate/> 
    <acc/> 
    <identification>170610009-01</identification> 
    </order> 
    <order> 
    <establishmenthour>10:40:00</ establishmenthour> 
    <ExpirationDate/> 
    <acc/> 
    <identification>170610910-03</identification> 
    </order> 
    <order> 
    <establishmenthour>10:42:00</ establishmenthour> 
    <ExpirationDate/> 
    <acc/> 
    <identification>170610015-01</identification> 
    </order> 

を持っていると私は2.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<Orderfile> 
<order> 
    <identification>170610009-01</identification> 
    <ExpirationDate>2017-06-21</ExpirationDate> 
    </order> 
<order> 
    <identification>170610015-01</identification> 
    <ExpirationDate>2017-02-22</ExpirationDate> 
    </order> 
<order> 
    <identification>170610024-01</identification> 
    <ExpirationDate>2017-08-02</ExpirationDate> 
    </order> 
    </Orderfile> 

と呼ばれる2番目のXMLファイルからこれらの情報を持っていると私はそれを持っていると思います - >マージ

<?xml version="1.0" encoding="UTF-8"?> 
<Orderfile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    <order> 
    <establishmenthour>10:38:00</establishmenthour> 
    <ExpirationDate>2017-06-21</ExpirationDate/> 
    <acc/> 
    <identification>170610009-01</identification> 
    </order> 
    <order> 
    <establishmenthour>10:40:00</ establishmenthour> 
    <ExpirationDate/> 
    <acc/> 
    <identification>170610910-03</identification> 
    </order> 
    <order> 
    <establishmenthour>10:42:00</ establishmenthour> 
    <ExpirationDate>2017-02-22</ExpirationDate/> 
    <acc/> 
    <identification>170610015-01</identification> 
    </order> 

.XML私はtexteファイルを読み、私は有効期限を追加ツイルxmlファイルへの«ID»その試合をしたいと思います。

これは私が試したものです:

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

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 
     <xsl:template match="version"> 
     <xsl:copy> 
      <xsl:apply-templates select="*"/> 
      <xsl:apply-templates select="document('2.xml')/Orderfile/order/*" /> 
     </xsl:copy> 
     </xsl:template> 

    </xsl:stylesheet> 

しかし、それは、あなたは私を助けてくださいすることができます働いていません。ここで

+0

ハードコードされた値私はそれを行うことができることに気づくでしょう。それから私はbashスクリプトを使って新しいxsltを生成します(値を修正しながらコピーする)。 – Rflow

+0

"texte"ファイルを制御できますか?それがXMLファイルであればはるかに簡単です。 XSLT 1.0では、 'document'関数を使って他のファイルにアクセスしますが、そのファイルはXMLである必要があります。また、XMLの場合は、IDを一致させる方が簡単です。 –

+0

'id(170610009-01)'は '170610009'から' 01'を差し引いた後、 'id'関数を呼び出してナンセンスにします。さらに、 'id'関数は' ID'属性を定義するDTDでのみ機能します。一般的には、XSLT 2.0に移動する方が良いです。ここで、 'unparsed-text'を使ってテキストファイルを読み込み、' tokenize'や 'xsl:analyze-string'で正規表現を使用してから、データは必要に応じて –

答えて

2

は、テキストファイル内のデータを解析することで読み、tokenizeするunparsed-textを使用してXSLT 2.0とそれを解決することができる方法である:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:param name="text-uri" select="'input.txt'"/> 
    <xsl:param name="lines" select="tokenize(unparsed-text($text-uri), '\r?\n')"/> 
    <xsl:param name="data" select="for $line in $lines return tokenize($line, ';')"/> 

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

    <xsl:template match="order[id = $data[position() mod 2 = 1]]/ExpirationDate"> 
     <xsl:copy> 
      <xsl:value-of select="$data[index-of($data, current()/../id) + 1]"/> 
     </xsl:copy>  
    </xsl:template> 

</xsl:stylesheet> 

XSLT 2.0は、酸素、スタイラスStudioのような様々なツールによってサポートされています、 Altova XMLSpyおよびSaxon 9、XmlPrime、Exseltのようなスタンドアロンのプロセッサ。あなたは次のようにあなたがXSLT 1.0を使用することができ、2つのXML入力文書を使用して質問を変更したことを今

私はそれを行う方法を見つけた場合、それは、最初のステップとなる可能性が実際に
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:param name="data-uri" select="'input2.xml'"/> 
    <xsl:param name="data-doc" select="document($data-uri)"/> 

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

    <xsl:template match="ExpirationDate"> 
     <xsl:copy> 
      <xsl:variable name="match" select="$data-doc//order[identification = current()/../identification]/ExpirationDate"/> 
      <xsl:choose> 
       <xsl:when test="$match"> 
        <xsl:value-of select="$match"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="."/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy>  
    </xsl:template> 

</xsl:stylesheet> 
+0

ありがとう、本当に私はxmlstarletを使用していますが、私はxslt 2.0では動作しないと思います。たぶん私はあなたの解決策の1つを使うべきでしょう。 – Rflow

+0

Martin、なぜラインとデータパラメータを作ったのですか? – Bluewood66

+0

@ Bluewood66では、代わりに変数を使用することができましたが、flexbilityの代わりにパラメータを使用していたため、Javaや.NETのSaxonを使用するアプリケーションでは、テキストファイルuriや文字列シーケンスなどのデータを渡すことができます。 –

関連する問題