2016-05-04 14 views
1

ルートノードの属性を変更するXSLドキュメントを作成したいと思いますが、XMLドキュメントの内容を変更することもできます。XSL:2つの異なる一致の結果を得る方法

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="some:ns"> 
<xsl:output indent="yes" method="xml" encoding="UTF-8" /> 
<xsl:strip-space elements="*"/> 

<ns:WhiteList> 
    <name>HEADER</name> 
    <name>ROOTNODE</name> 
    <name>foo</name> 
    <name>bar</name> 
    <name>toto</name> 
</ns:WhiteList> 

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

<xsl:template match="ROOTNODE[@xsi:id = 'myXSDFile.xsd'] "> 
    <xsl:copy> 
     <xsl:attribute name="xsi:id ">myXSDFCleansedFile.xsd</xsl:attribute> 
     <xsl:apply-templates select="ROOTNODE[@xsi:id = 'myXSDFile.xsd']"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/ns:WhiteList/*])]"/> 

</xsl:stylesheet> 

そして、私の入力XML文書には、次のいずれかです:

<?xml version="1.0" encoding="UTF-8"?> 
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:id="myXSDFile.xsd"> 
    <HEADER> 
     .... 
    </HEADER> 
    <foo>blabla</foo> 
    <bar>blabla</bar> 
    <tab>dada</tab> 
    <toto>blabla</toto> 
    <titi>blabla</titi> 
</ELIX> 

私は得られた出力は、次のいずれかです。

<?xml version="1.0" encoding="UTF-8"?> 
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:id="myXSDFileCleansed.xsd"> 

それともここ

は私のXSLドキュメントです:

<?xml version="1.0" encoding="UTF-8"?> 
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:id="myXSDFile.xsd"> 
    <HEADER> 
     .... 
    </HEADER> 
    <foo>blabla</foo> 
    <bar>blabla</bar> 
    <toto>blabla</toto> 
</ROOTNODE> 

しかし、問題は、2番目の出力が欲しいということですが、xsdファイル名が変更されました!そして私は2つの異なるマッチパスをマージすることに成功しなかった。 2つのマッチパスをマージする方法はありますか?

答えて

1

あなたが正確に試したことはありませんでした。しかし、最初に、あなたがあなたのXSLを適用したときに処理子どもをwan't場合は、交換してみてください。

<xsl:apply-templates select="ROOTNODE[@xsi:id = 'myXSDFile.xsd']"/>

<xsl:apply-templates/>

とテンプレートである場合、コンテキストはROOTNODEとしたときでありますテンプレートを"ROOTNODE[...]"に適用しようとすると、プロセッサはROOTNODEという名前のコンテキストの子を探しています。

関連する問題