【问题标题】:Add namespaces to XML from XSD从 XSD 向 XML 添加命名空间
【发布时间】:2015-01-27 12:00:16
【问题描述】:

例如我有 XML:

<a>
 <b>c</b>
</a>

xsdA.xsd:

<xs:import schemaLocation="xsdB.xsd"/>
<xs:element name="a" xmlns:xsa="http://www.example.org/a" type="xsa:aType"></xs:element>

xsdB.xsd:

<xs:element name="b" xmlns:xsb="http://www.example.org/b" type="xsb:bType"></xs:element>

我想以某种方式将 XML 转换成这样:

<xsa:a xmlns:xsa="http://www.example.org/a">
 <xsb:b xmlns:xsb="http://www.example.org/b">c</xsb:b>
</xsa:a>

我听说可以通过 JAXB 来完成,但是有没有什么方法可以在不生成代码的情况下做到这一点? 我使用 Java。

编辑:

这只是一个例子。我可以通过 xslt 或手动在 DOM 对象中添加命名空间,但我的 xsds 现在是 170K 大小。而且它经常变化。我只想更换 xsd 和程序继续工作。

如何在一堆 xsd 文件中找到具有给定本地名称的元素的命名空间?

EDIT2:

我的 xsds 中的所有本地名称似乎都不同。

【问题讨论】:

  • 是的,您可以使用 JAXB,但如果您只想进行这种转换,那么 XSLT 之类的东西可能是更好的选择。
  • 我的xsd很大,不能写那么多模板。我编辑我的问题。
  • 您可以使用 XSLT 在 XSD 文件(一个或多个)中定位具有特定本地名称的元素,然后使用它来转换 XML。 - 是否有一个顶级 XSD(递归)导入所有其他 XSD? - 为什么需要添加这些命名空间?是不是不能正确生成XML?
  • 是的,我有一个顶级 xsd 可以导入所有其他 xsd。如何通过xslt定位xsd中元素的命名空间? XML 来自另一个系统,由于向后兼容性,因此不能与命名空间一起使用。
  • 问题是尽管命名空间定义在 XSD 中,但没有简单的方法可以将元素定义中的名称与其所属的命名空间相关联。您能否提供和维护诸如xsdA http://www.example.org/axsdB http://www.example.org/b 之类的文本?也许作为一个简单的 XML 可以读取转换并用于查找命名空间 URI?

标签: java xml namespaces xsd


【解决方案1】:

正如 laune 所建议的,一个非常基本的 XSLT 应该可以帮助您入门。

XSLT:

<xsl:stylesheet version="2.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
                xmlns:xsa="http://www.example.org/a" 
                xmlns:xsb="http://www.example.org/b">
    <xsl:output omit-xml-declaration="no" indent="yes" />

    <xsl:template match="a">
        <xsa:a><xsl:apply-templates select="node() | @*" /></xsa:a>
    </xsl:template>

    <xsl:template match="b">
        <xsb:b><xsl:apply-templates select="node() | @*" /></xsb:b>
    </xsl:template>

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>     
</xsl:stylesheet>

输入:

<a>
  <b>c</b>
</a>

输出:

<xsa:a xmlns:xsa="http://www.example.org/a" xmlns:xsb="http://www.example.org/b">
   <xsb:b>c</xsb:b>
</xsa:a>

【讨论】:

  • 感谢您的建议,但我的 xsd 很大,无法编写这么多模板。我编辑我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多