2017-03-07 11 views
0

私はXSLTで変換を行っています。私は兄弟を追加する必要があります。要素x及びyは、オプションから、必要に行くことを意味する、以下のXSDXSLT変換 - 不在の兄弟を追加する場合

<xs:complexType name="parent"> 
    <xs:sequence> 
     <xs:element name="a" type="xs:string" minOccurs="0"/> 
     ... more optional elements... 
     <xs:element name="x" type="xs:string"/> 
     <xs:element name="y" type="xs:string"/> 
     <xs:element name="z" type="xs:string"/> 
    </xs:sequence> 
</xs:comlexType> 

により与えられるXMLに

<xs:complexType name="parent"> 
    <xs:sequence> 
     <xs:element name="a" type="xs:string" minOccurs="0"/> 
     ... more optional elements... 
     <xs:element name="x" type="xs:string" minOccurs="0"/> 
     <xs:element name="y" type="xs:string" minOccurs="0"/> 
     <xs:element name="z" type="xs:string"/> 
    </xs:sequence> 
</xs:comlexType> 

Iは、以下のXSDによって与えられたXMLを形質転換してい行方不明の場合は追加する必要があります。

ケース1(何も追加すべきではない):

<parent> 
    <a>foo</a> 
    ... 
    <x>foo</x> 
    <y>foo</y> 
    <z>foo</z> 
</parent> 

ケース2(xは追加する必要がある)

<parent> 
    <a>foo</a> 
    ... 
    <y>foo</y> 
    <z>foo</z> 
</parent> 
これは私のXSLT変換は、以下の4つのケースを処理する必要があることを意味し

ケース3(yを追加する必要があります)

<parent> 
    <a>foo</a> 
    ... 
    <x>foo</x> 
    <z>foo</z> 
</parent> 

ケース4(xおよびyは、添加されるべきである)

<parent> 
    <a>foo</a> 
    ... 
    <z>foo</z> 
</parent> 

Iは、意図したとおりに動作しない以下のXSLTを試みた:

<xsl:template match="parent[not(x)]/y"> 
    <xsl:element name="x">foo</xsl:element> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="parent[not(x)]/z"> 
    <xsl:element name="x">foo</xsl:element> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="parent[not(y)]/z"> 
    <xsl:element name="y">foo</xsl:element> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

上記の場合の結果であります

ケース1 OK

<parent> 
    <a>foo</a> 
    ... 
    <x>foo</x> 
    <y>foo</y> 
    <z>foo</z> 
</parent> 

ケース2 OK

<parent> 
    <a>foo</a> 
    ... 
    <x>foo</x> 
    <y>foo</y> 
    <z>foo</z> 
</parent> 

ケース3ないOK

<parent> 
    <a>foo</a> 
    ... 
    <x>foo</x> 
    <y>foo</y> 
    <x>foo</x> 
    <z>foo</z> 
</parent> 

ケース4ないOK

<parent> 
    <a>foo</a> 
    ... 
    <y>foo</y> 
    <z>foo</z> 
</parent> 
+1

どうしますか?どのように結果は期待された結果と異なるか? – Sim

答えて

0

あなたがxy子要素でもないとparent要素を持っている場合は、あなたのスタイルシートは、そのパターンそのparentz子と一致等しい優先度のテンプレートを提供しています。プロセッサとXSLTのバージョンによってはエラーが発生する可能性がありますが、後で定義されるテンプレートが選択される可能性が高くなります。それでy兄弟が挿入されますが、xは挿入されません。

この問題にはいくつかの方法があります。特に、テンプレートのパターンを使用し、<xsl:if>要素を使用して選択肢を並べ替えることができます。両方のビットを使用してジョブを実行するスタイルシートは次のとおりです。

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

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

<xsl:template match="parent[not(x)]/y"> 
    <xsl:element name="x">foo</xsl:element> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="parent[not(y)]/z"> 
    <xsl:if test="not(../x)"> 
    <xsl:element name="x">foo</xsl:element> 
    </xsl:if> 
    <xsl:element name="y">foo</xsl:element> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

ありがとうございました - それは仕事をしました:) – TDA

関連する問題