2011-03-16 103 views
4

在xsl轉換後,我在結果xml文件中的名稱空間位置有問題。XSLT:將名稱空間設置爲第一個屬性

我的轉換樣式看起來像

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xsl:output indent="yes" method="xml" /> 
<xsl:template match="/"> 

<xsl:element name="SmartDriveUpdates"> 
    <xsl:attribute name="xsi:noNamespaceSchemaLocation"> 
    <xsl:text>LightSpeedXMLSchema.xsd</xsl:text> 
    </xsl:attribute> 
... 
</xsl:element> 

在輸出XML文件我想根節點

而是我有

<SmartDriveUpdates xsi:noNamespaceSchemaLocation="LightSpeedXMLSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

我也想前置碼根節點XSL樣式表作爲

<SmartDriveUpdates xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LightSpeedXMLSchema.xsd"> 
    ... 
</SmartDriveUpdates> 

但我得到同樣的錯誤的結果。

通過使用System.xml.xsl.xslcompiledtransform .NET類的Transform方法轉換爲xml文件。我爲此使用PowerShell:

Function Convert-WithXslt($originalXmlFilePath, $xslFilePath, $outputFilePath) { 
## Simplistic error handling 
$xslFilePath = Resolve-Path $xslFilePath 
If(-not (Test-Path $xslFilePath)) { 
    Throw "Can't find the XSL file" 
} 

$originalXmlFilePath = Resolve-Path $originalXmlFilePath 
If(-not (Test-Path $originalXmlFilePath)) { 
    Throw "Can't find the XML file" 
} 

#$outputFilePath = Resolve-Path $outputFilePath 
If(-not (Test-Path (Split-Path $originalXmlFilePath))) { 
    Throw "Can't find the output folder" 
} 

## Get an XSL Transform object (try for the new .Net 3.5 version first) 
$EAP = $ErrorActionPreference 
$ErrorActionPreference = "SilentlyContinue" 

$script:xslt = New-Object system.xml.xsl.xslcompiledtransform 
Trap [System.Management.Automation.PSArgumentException] 
{ # no 3.5, use the slower 2.0 one 
    $ErrorActionPreference = $EAP 
    $script:xslt = New-Object system.xml.xsl.xsltransform 
} 
$ErrorActionPreference = $EAP 

## load xslt file 
$xslt.load($xslFilePath) 

## transform 
$xslt.Transform($originalXmlFilePath, $outputFilePath) 
} 

有人可以幫我解決這個問題嗎?

感謝

+0

問得好,+1的結果。請參閱我的解答和解決方案 – 2011-03-16 12:42:27

回答

1

命名空間定義和屬性的順序取決於實現方式

你有兩個選擇:

  1. 使用另一個XSLT處理器 - 撒克遜6.5.4或撒克遜9.x中(有一個.NET版本),一些版本的Altova(XML-SPY)和XQSharp都會根據需要生成輸出。

  2. 繼續使用XslCompiledTransform,但實現您自己的XmlWriter對象。你可以自由的執行WriteElementString方法()來以任何想要的方式產生元素的序列化。

+0

謝謝,我會嘗試使用自己的XmlWriter或修復我們的合併工具。 – 2011-03-16 13:03:19

+0

@ Roman-Kuzyk:不客氣。 – 2011-03-16 13:12:37

2

屬性和命名空間聲明屬性並不重要,我不覺得當你使用XSLT,您可以定義訂單的訂單。爲什麼訂單對你很重要?

+0

我知道,但我們有一些合併工具在轉換後合併這些文件,如果沒有找到名稱空間作爲第一個節點,它會崩潰:( – 2011-03-16 13:02:04

+0

如果您有依賴於屬性順序的東西,它會被破壞,您應該修復如果你有任何控制權 – Cumbayah 2011-03-16 14:26:19

+2

同意任何依賴於特定順序的屬性的工具都應退還給製造商並要求退款,將XML描述爲錯誤的而不是消耗它的工具,是錯誤的心態 – 2011-03-16 15:30:01

0

如果你不想放棄XslCompiledTransform,您可以使用XQSharp的XmlWriter的實現,而不是寫你自己的,這可能會產生你所尋找的,

相關問題