2011-03-16 135 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的实现,而不是写你自己的,这可能会产生你所寻找的,

相关问题