2012-03-21 6 views
1

入力xml内のノードのサブセットを持つ入力xmlを別のものに変換するには、XSLTファイルが必要です。入力は10個のノードを持っている場合は元のために、私は約5ノード 入力と出力を作成する必要がxsltを使用してxml入力のサブセットをコピーする

<Department diffgr:id="Department1" msdata:rowOrder="0"> 
    <Department>10</Department> 
    <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
    <DepartmentSeq>7</DepartmentSeq> 
    <InsertDateTime>2011-09-29T13:19:28.817-05:00</InsertDateTime> 
    </Department> 

出力:私たちは XSLTを必要といけないノードを抑制するための一つの方法を発見した

<Department diffgr:id="Department1" msdata:rowOrder="0"> 
    <Department>10</Department> 
    <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
    </Department> 

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

    <xsl:output omit-xml-declaration="yes"/> 

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

    <xsl:template match="Department/DepartmentSeq"/> 
    <xsl:template match="Department/InsertDateTime"/> 

</xsl:stylesheet> 

私は私のXSLT wを変更する必要がありますので、私は、私は「すべてをコピーして、私が必要といけないものを除外する」私は必要なノードを選択していないのに役立ちますXSLTを必要としますhenever入力スキーマは、より多くのノードを追加します。

更新:

送信したスニペットは.NET Diffgramからのものでした。ボロディンが提供するXSLT、で

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <NewDataSet> 
    <MessageHeader> 
     <MessageID>201112270242029525719b93a-5fc5-42ce-8424-10764a4497ca</MessageID> 
     <RequestType>Publish</RequestType> 
     <ListOfApplications /> 
     <MessageType>MCH</MessageType> 
    </MessageHeader> 
    <Department diffgr:id="Department1" msdata:rowOrder="0"> 
     <Department>10</Department> 
     <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
     <DepartmentSeq>7</DepartmentSeq> 
     <InsertDateTime>2011-09-29T13:19:28.817-05:00</InsertDateTime> 
     <UpdateDateTime>2011-09-30T11:50:59-05:00</UpdateDateTime> 
     <InsertDateTimeUTC>2011-09-29T18:19:28.817-05:00</InsertDateTimeUTC> 
    </Department> 
    <Subclass diffgr:id="Subclass1" msdata:rowOrder="0" diffgr:hasChanges="modified"> 
     <Department>10</Department> 
     <Category>03</Category> 
     <Class>010</Class> 
     <Subclass>03</Subclass> 
     <SubclassLongDescription>BABY ACCESSORIES-OTHER LD TX 1120</SubclassLongDescription> 
     <SubclassShortDescription>BABY ACCESSORIES-OTH</SubclassShortDescription> 
    </Subclass> 
    </NewDataSet> 
    <diffgr:before> 
    <Subclass diffgr:id="Subclass1" msdata:rowOrder="0"> 
     <Department>10</Department> 
     <Category>03</Category> 
     <Class>010</Class> 
     <Subclass>03</Subclass> 
     <SubclassLongDescription>BABY ACCESSORIES-OTHER LD TX 1120</SubclassLongDescription> 
     <SubclassShortDescription>BABY ACCESSORIES-OTH</SubclassShortDescription> 
    </Subclass> 
    </diffgr:before> 
</diffgr:diffgram> 

HERESに私は、私はそれらの部門とDepartmentDescriptionタグが、何もしたくない

<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <NewDataSet> 
    <MessageHeader> 
     <MessageID>201112270242029525719b93a-5fc5-42ce-8424-10764a4497ca</MessageID> 
     <RequestType>Publish</RequestType> 
     <ListOfApplications /> 
     <MessageType>MCH</MessageType> 
    </MessageHeader> 
    <Department diffgr:id="Department1" msdata:rowOrder="0"> 
     <Department>10</Department> 
     <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
    </Department> 
    <Subclass diffgr:id="Subclass1" msdata:rowOrder="0" diffgr:hasChanges="modified"> 
     <Department>10</Department> 
     <Category>03</Category> 
     <Class>010</Class> 
     <Subclass>03</Subclass> 
     <SubclassLongDescription>BABY ACCESSORIES-OTHER LD TX 1120</SubclassLongDescription> 
     <SubclassShortDescription>BABY ACCESSORIES-OTH</SubclassShortDescription> 
    </Subclass> 
    </NewDataSet> 
    <diffgr:before> 
    <Subclass diffgr:id="Subclass1" msdata:rowOrder="0"> 
     <Department>10</Department> 
     <Category>03</Category> 
     <Class>010</Class> 
     <Subclass>03</Subclass> 
     <SubclassLongDescription>BABY ACCESSORIES-OTHER LD TX 1120</SubclassLongDescription> 
     <SubclassShortDescription>BABY ACCESSORIES-OTH</SubclassShortDescription> 
    </Subclass> 
    </diffgr:before> 
</diffgr:diffgram> 

を得るもの:

入力を次のように完全なXMLです。 MessageHeader /サブクラスがxsltで指定されていないときにコピーされる他のノードはなぜですか?

誰でも私より上の方が良い解決策を与えることができます。このようにすべてのノードを追加するのは面倒ですが、他には何もできない場合は機能します。

答えて

2

アイデンティティ変換を使用することをお勧めします。<Department>要素を扱う特別なルールを使用して、コピーする子を指定できます。ここにいくつかのサンプルコードがあります。

<?xml version="1.0" encoding="UTF-8" ?> 

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

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="Department[Department]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|Department|DepartmentDescription" /> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

あなただけの特定のノードを一致させたい場合は、単に、除外のリストを提供することができなくて、私はあなたの更新内のデータを使用して取得した出力は、そう

<?xml version="1.0" encoding="utf-8"?> 
<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 

    <NewDataSet> 

     <Department diffgr:id="Department1" msdata:rowOrder="0"> 
     <Department>10</Department> 
     <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
     </Department> 

    </NewDataSet> 

</diffgr:diffgram> 
+0

返事のおかげで、私は部門(兄弟)の同じレベルの複数のノードがある場合、私は部門 2の属性を失う 1.このXSLTと2つの問題を持って、彼らはまだコピーされます。私はちょうど私が欲しいものをコピーする単純なxsltを持つことはできません...? – mdfaraz

+0

@mdfaraz私は属性に対処するために私の答えを修正しました。私は ''の兄弟について何を意味するのか分かりません。その名前で* inner *要素を意味するなら、それは私のためにうまくいき、 'Department/Department'と' Department/Department'だけを含んでいます。最初のレベルのDepartment要素を意味する場合、あなたのデータもあなたの質問も、どんな兄弟も言及していませんでした。説明してください。 – Borodin

+0

@mdfaraz:** edit **上記の私のコメントでは、私は 'Department/Department'と' Department/DepartmentDescription'を意味しました – Borodin

1

のように見えます以下のXSLT

与え、あなたはそう

<xsl:template match="Department|DepartmentSeq|InsertDateTime|@*"> 

を必要とする要素名のリストを入力します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="Department|DepartmentSeq|InsertDateTime|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*" /> 
</xsl:stylesheet> 

次のXML(私は簡略化のために名前空間接頭辞を削除しました)

<Department id="Department1" rowOrder="0"> 
    <Department>10</Department> 
    <DepartmentDescription>BABY PRODUCTS</DepartmentDescription> 
    <DepartmentSeq>7</DepartmentSeq> 
    <InsertDateTime>2011-09-29T13:19:28.817-05:00</InsertDateTime> 
</Department> 

に適用すると、次が出力されます。属性は@ *マッチによって保持されることに注意してください。

<Department id="Department1" rowOrder="0"> 
    <Department>10</Department> 
    <DepartmentSeq>7</DepartmentSeq> 
    <InsertDateTime>2011-09-29T13:19:28.817-05:00</InsertDateTime> 
</Department> 

以下のテンプレートマッチの使用に注意してください。一致するリストにないすべての要素が除外されます。これがないと、デフォルトの動作は、出力に

<xsl:template match="*" /> 
+0

私が送ったスニペットは.NET Diffgram – mdfaraz

0

このソリューションは、私の入力が

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

    </xsl:template> 
    <xsl:template match="*" /> 

</xsl:stylesheet> 

のための最善を働いた要素のテキスト値になり、私は、各ノードの一致を記述することことがわかりました階層的には非常に面倒です。まだ動作しますが、より良いソリューションが歓迎されます!

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
<xsl:output indent="yes"/><xsl:strip-space elements="*"/> 

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

    <!-- shutup unwanted elements --> 
    <xsl:template match="MessageHeader 
     | Subclass 
     | InsertDateTime 
     | UpdateDateTime 
     | InsertDateTimeUTC 
     | DepartmentSeq 
     | diffgr:before"/> 

</xsl:stylesheet> 
関連する問題