2012-07-27 59 views
0

我是XSL/XML的新手,我需要幫助進行XSL轉換。如何使用XSLT複製根節點的命名空間和屬性?

我有XML這將啓動這樣

<?xml version="1.0" encoding="UTF-8"?> 
<Invoice 
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd" 
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
    xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" 
    xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" 
    xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"> 
<ext:UBLExtensions> 
    <ext:UBLExtension> 
    <cbc:ID>INVOICE1</cbc:ID> 
<cbc:Name>InvoiceIssuePlaceData</cbc:Name> 
    <ext:ExtensionAgencyURI>urn:invoice:hr:issueplace</ext:ExtensionAgencyURI> 
    <ext:ExtensionContent> 
     <ext:InvoiceIssuePlace>London</ext:InvoiceIssuePlace> 
    </ext:ExtensionContent> 
    </ext:UBLExtension> 
</ext:UBLExtensions> 
<cbc:UBLVersionID>2.1</cbc:UBLVersionID> 
<cbc:ID>01 1206-2406-568</cbc:ID> 
</Invoice> 

我想創建一個所有屬性的元素,並創造具有屬性節點的值標籤<之間要素_>。

這裏是xsl ...

<?xml version='1.0' encoding='utf-8' ?> 
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
    xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" 
    xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2" 
    xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd" 
    version="1.0"> 
    <xsl:output method="xml"/> 
    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="@*|*|text()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|*|text()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*[@*]"> 
    <xsl:element name="{name()}"> 
    <xsl:if test="count(@*)>=count(node())"> 
     <_> 
     <xsl:value-of select="."/> 
     </_> 
    </xsl:if> 
    <xsl:for-each select="@*"> 
     <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:for-each> 
    <xsl:if test="count(node())>count(@*)"> 
     <xsl:apply-templates select="*|text()"/> 
    </xsl:if> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

的問題是,這種轉變不轉變根節點(發票),因爲我需要。我得到:

<?xml version="1.0"?> 
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"> 
    <xsi:schemaLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</xsi:schemaLocation> 

發票中沒有其他屬性和新元素。只有xsi:schemaLocation,但在該節點的級別上定義了名稱空間。

我在做什麼錯了?

謝謝。

+0

*我想創建一個所有屬性的元素,並創造元素在'<_>'標籤之間爲具有屬性*的節點的值。我不明白。你指的是什麼屬性? – mzjn 2012-07-27 22:18:29

+0

源xml中的所有屬性都應該轉換爲子元素,除了根節點,它應該保留名稱空間屬性併爲每個屬性創建子元素。 – 2012-07-28 00:35:53

+0

您的XML包含名稱空間聲明,但沒有屬性。請告訴我們期望的輸出是什麼樣子。 – mzjn 2012-07-28 07:24:23

回答

0

這個樣式表...

<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="@*"> 
<xsl:element name="{name()}" namespace="{namespace-uri()}"> 
    <_><xsl:value-of select="."/></_> 
</xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

...將改變你的根節點到...

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"> 
    <xsi:schemaLocation> 
    <_ xmlns="">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</_> 
    </xsi:schemaLocation> 
0

我也不至於是什麼問題完全清楚,但我認爲這可能與模板,你正在使用,以配合目前

<xsl:template match="*[@*]"> 
    <xsl:element name="{name()}"> 

在特定屬性的元素,在XSL :元素命令將創建一個全新的元素,但是您沒有說什麼關於應該爲該新元素聲明哪些名稱空間。試試這個

<xsl:template match="*[@*]"> 
    <xsl:copy> 

這應該與命名空間聲明(但它的屬性)一起創建發票的副本。

相關問題