【问题标题】:XSLT output has different namespace but same namespace prefix as inputXSLT 输出具有不同的名称空间,但名称空间前缀与输入相同
【发布时间】:2017-05-29 11:28:28
【问题描述】:

我想将验证架构 (2) 的 XML 实例转换为验证旧架构 (1) 的实例。

这 2 个架构使用不同的命名空间 URI,但这些 URI 共享相同的元素名称前缀。

唯一的解决方法是在转换之前更改输入中使用的命名空间前缀吗?还是可以将其内置到 XSLT 中?

【问题讨论】:

  • 模式不定义任何前缀,它们定义目标命名空间。
  • 是的,这是真的。我正在假设可以只分配一个工作前缀以在 XSLT 中使用,并期望它能够识别在实例中找到的 URI,无论实例使用什么作为前缀?
  • 我需要转换的实例将使用模式中为方便而定义的前缀,并且 (1) 和 (2) 对 2 个不同的 URI 使用相同的前缀。
  • 您能否发布您尝试过的 XML 输入、XML 输出和 XSLT 的最小但完整的 sn-ps?正如您所说,您有一种输入格式要转换为第二种输出格式,我不确定您为什么会看到前缀问题,您当然可以编写例如<xsl:template match="pf:foo" xmlns:pf="http://example.com"><pf:bar xmlns:pf="http://example.org">...</pf:bar></xsl:template>

标签: xml xslt xml-namespaces


【解决方案1】:

是唯一的解决方法,只是更改在 转换前的输入?

不,解决方案是为样式表中的源 XML 命名空间使用不同的前缀。这是一个最小的例子:

XML

<abc:root xmlns:abc="www.example.com/source"/>

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:src="www.example.com/source"
xmlns:abc="www.example.com/target"
exclude-result-prefixes="src"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="src:*">
    <xsl:element name="abc:{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>  

结果

<?xml version="1.0" encoding="UTF-8"?>
<abc:root xmlns:abc="www.example.com/target"/>

【讨论】:

  • 这是我发布后 2 分钟的工作假设。一旦我完成了基于此的 XSLT,我将结束这个问题。
猜你喜欢
  • 2018-06-25
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多