2017-09-30 11 views
1

次のXSLTを使用してXML文書のコンテンツを変換しようとしています。しかし、私の要素の1つは、以前の名前空間でコピーされています。下記参照。XSLTですべての要素の名前空間を変更する

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:cd="http://schemas.datacontract.org/2004/07/CMachine" xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" exclude-result-prefixes="cd"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="cd:ArrayOfMachine"> 
    <Inventory> 
     <Schema>2018</Schema> 
     <Machines> 
     <xsl:apply-templates select="@*|node()" /> 
     </Machines> 
    </Inventory> 
    </xsl:template> 
</xsl:stylesheet> 

入力:

​​

出力:

<?xml version="1.0" encoding="utf-8"?> 
<Inventory xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Schema>2018</Schema> 
    <Machines> 
    <Machine xmlns="http://schemas.datacontract.org/2004/07/CMachine"> 
     <Price>120000</Price> 
     <Properties> 
     <Axes>XYZ</Axes> 
     </Properties> 
    </Machine> 
    </Machines> 
</Inventory> 

所望の出力:

<?xml version="1.0" encoding="utf-8"?> 
<Inventory xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Schema>2018</Schema> 
    <Machines> 
    <Machine> 
     <Price>120000</Price> 
     <Properties> 
     <Axes>XYZ</Axes> 
     </Properties> 
    </Machine> 
    </Machines> 
</Inventory> 

この問題を解決するためにXSLTに必要とされている何のひねり? ご協力いただければ幸いです!

答えて

1

xsl:copyを使用すると、ノードとその名前空間がコピーされます。同じlocal-name()の要素を生成して名前空間を削除する場合は、新しい要素を作成する必要があります。テンプレートを作成してすべての要素に一致させ、汎用(非名前空間)要素を生成し、属性、text()、comment()およびprocessing-instruction()ノードにのみ一致させることができます。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:cd="http://schemas.datacontract.org/2004/07/CMachine" xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" exclude-result-prefixes="cd"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*|text()|comment()|processing-instruction()"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="cd:ArrayOfMachine"> 
    <Inventory> 
     <Schema>2018</Schema> 
     <Machines> 
     <xsl:apply-templates select="@*|node()" /> 
     </Machines> 
    </Inventory> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題