使用 XSLT 将其他命名空间/架构位置添加到 XML 文件

发布于 2024-10-15 06:09:41 字数 768 浏览 2 评论 0原文

我想将: 转换

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd">
<p></p></ppx>

为:

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ppxx="http://www.m.com/mExt/v1" 
xmlns:ppxtpx="http://www.m.com/mExt/v3" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
<p></p></ppx>

我需要将一些命名空间声明及其关联的 schemaLocations 添加到现有的 XML 文件中,而不更改该 XML 中的其他任何内容。

I want to convert:

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd">
<p></p></ppx>

into:

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ppxx="http://www.m.com/mExt/v1" 
xmlns:ppxtpx="http://www.m.com/mExt/v3" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
<p></p></ppx>

I need to add a few namespace declarations and their associated schemaLocations to an existing XML file without changing anything else in that XML.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最佳男配角 2024-10-22 06:09:41

原则上这很简单:它只需要一个标准的“修改后的身份模板”模式:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="ppx">
<ppx xmlns="http://www.p.com/ppx/1" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:ppxx="http://www.m.com/mExt/v1" 
  xmlns:ppxtpx="http://www.m.com/mExt/v3" 
  xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
    http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
    http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
    <xsl:apply-templates/>
  </ppx>
</xsl:template> 

但是,它可能会变得更加复杂,具体取决于输入与您向我们展示的示例的差异程度。例如,如果根元素并不总是被命名为 ppx,或者如果事先不知道要添加的命名空间。所以你可能需要解释问题的更多细节

In principle it's easy: it just needs a standard "modified identity template" pattern:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="ppx">
<ppx xmlns="http://www.p.com/ppx/1" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:ppxx="http://www.m.com/mExt/v1" 
  xmlns:ppxtpx="http://www.m.com/mExt/v3" 
  xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
    http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
    http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
    <xsl:apply-templates/>
  </ppx>
</xsl:template> 

However, it could get a bit more complicated depending on how much the input can vary from the example you have shown us. For example if the root element will not always be named ppx, or if the namespaces to be added are not known in advance. So you may need to explain more details of the problem

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文