在解决以下问题时需要一些帮助。我需要将以下输入(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>
提前致谢。 加布里埃尔
答案 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的相当尴尬的方式,我只是为了完整性而给出这个 - 如果添加名称空间前缀是唯一需要解决的问题,我肯定会寻求更便宜的搜索/替换选项。)
希望这有帮助,
罗恩