XSLT有助于声明命名空间

时间:2010-09-20 02:34:39

标签: xslt

在解决以下问题时需要一些帮助。我需要将以下输入(XML)转换为提到的输出(XML)。

   <Header>
      <End_Date xsi:nil="true"/>
   <Header>

采用以下格式。

   <Header>
      <End_Date xsi:nil="true" xmlns:xsi"http://www.w3.org/2001/XMLSchema"/>
   <Header>

这是样式表:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs">  

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>  

    <xsl:template match="/">  
      <HEADER>  
        <xsl:for-each select="HEADER">  
          <xsl:sequence select="(./@node(), ./node())"/>
        </xsl:for-each>  
      </HEADER>  
    </xsl:template> 
</xsl:stylesheet>

提前致谢。 加布里埃尔

1 个答案:

答案 0 :(得分:0)

我是否正确地想要重现输入XML的几乎完全的副本,并添加了输入中缺少的xsi名称空间声明?

首先,就像现在一样,您的输入不是格式良好的XML,只是因为缺少xsi名称空间声明。因此,没有办法使用XSLT来添加它:任何XSLT处理器都会阻塞输入的非格式化。

其次,您必须检查区分大小写:当前,<xsl:for-each select="HEADER">选择表达式没有输入节点匹配。如果您将其更改为"Header",则模板规则确实会将<Header>输入替换为<HEADER>,其内容将以相同方式复制。但是......只有在输入权限中有命名空间声明...

因此,如果目的确实是将非格式良好的XML“升级”为格式良好的版本,我建议寻找其他工具,例如Perl,Awk或任何其他简单的搜索/替换在纯文本上运行的解决方案,只需将缺少的名称空间声明添加到文档元素:

<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <End_Date xsi:nil="true"/>
</Header>

(当然,您也可以使用XSLT 2.0的unparsed-text($href)函数,让您将任何文件作为未解析的文本读取,然后您可以使用<xsl:analyze-string>进一步处理。请参阅Michael Kay的文章Up-conversion using XSLT 2.0以获得进一步的灵感。由于这是一种使用XML工具处理非XML的相当尴尬的方式,我只是为了完整性而给出这个 - 如果添加名称空间前缀是唯一需要解决的问题,我肯定会寻求更便宜的搜索/替换选项。)

希望这有帮助,

罗恩