2012-04-25 4 views
1

私のXMLファイルの内容に応じてXMLファイルを変換して新しいノードを追加する必要があります。 は、例えば、私が持っている:ファイルの内容に応じてxml-fileに新しいノードを追加

<sheet name="Sheet1" num="1"> 
<row num="3"> 
<cell num="1">FP1152</cell> 
<cell num="2">1039_2</cell> 
<cell num="3">FP000234</cell> 
</row> 
<row num="4"> 
<cell num="1">RT1152</cell> 
<cell num="2">1039_1</cell> 
<cell num="3">GL000235</cell> 
</row> 
<row num="6"> 
<cell num="1">FP1152</cell> 
<cell num="2">1039_1</cell> 
<cell num="3">FP000234</cell> 
</row> 

</sheet> 

を私は細胞の別のペアに異なる行のnum個のatributeの同じ値が異なる値を持つセルに同じ値を持っている場合(私の例では、それは、@ NUM =を持つ行です特定のシート内の行は、1と3の@num、私ができる次いで、一方向での細胞によってグループ化されている場合

<sheet name="Sheet1" num="1"> 
<flag type="ambiguousSuplier">true<flag> 
    <row num="3"> 
    <cell num="1">FP1152</cell> 
    <cell num="2">1039_2</cell> 
    <cell num="3">FP000234</cell> 
    </row> 
    <row num="4"> 
    <cell num="1">RT1152</cell> 
    <cell num="2">1039_1</cell> 
    <cell num="3">GL000235</cell> 
    </row> 
    <row num="6"> 
    <cell num="1">FP1152</cell> 
    <cell num="2">1039_1</cell> 
    <cell num="3">FP000234</cell> 
    </row> 

    </sheet> 
+0

行を比較するためにnum = 1のセルが使用されていますか?すなわち、num = 4の行は別々にチェックする必要がありますか? –

+0

はい、行番号num = 4の場合はすべてokです。セルnum = 1で行を最初に比較し、num = 1のセルでnum = 3と比較する必要があります。 –

+0

各行に3つのセルしか存在しませんか?または、無制限の番号を持つことはできますか? –

答えて

2

:3とNUM = 6 @)、私はこのようにフラグを追加しますこれを行うと思うのは、そのような細胞をキーでグループ化することです。

<xsl:key 
name="cells" 
match="cell" 
use="concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num)" /> 

これは、シート番号と同じ行内のセル1と2でセルを検索します。

シートに、上記のキーに一致するセルが含まれていて異なる値のセルが含まれているかどうかを確認する必要があります。これはあなたの指定したXMLに適用すると、次のXSLT

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

    <xsl:key name="cells" match="cell" use="concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num)" /> 

    <xsl:template match="sheet[row/cell[text() != key('cells', concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num))/text()]]"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <flag type="ambiguousSupplier">true</flag> 
     <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 

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

を与え、

<xsl:template 
    match="sheet 
    [row/cell 
     [text() != 
     key('cells', 
     concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num))/text()]]"> 

したがって、次の厄介な見通しに関する記述によって行われ、次は私は確信して出力

<sheet name="Sheet1" num="1"> 
    <flag type="ambiguousSupplier">true</flag> 
    <row num="3"> 
     <cell num="1">FP1152</cell> 
     <cell num="2">1039_2</cell> 
     <cell num="3">FP000234</cell> 
    </row> 
    <row num="4"> 
     <cell num="1">RT1152</cell> 
     <cell num="2">1039_1</cell> 
     <cell num="3">GL000235</cell> 
    </row> 
    <row num="6"> 
     <cell num="1">FP1152</cell> 
     <cell num="2">1039_1</cell> 
     <cell num="3">FP000234</cell> 
    </row> 
</sheet> 

ですより簡単な解決策が必要です。問題を解決しても、この回答はまだ受け付けません.....

+0

ありがとう、とても役に立ちます。良い答えは –

+0

+1です。 –

関連する問題