xml - 使用 namespace 通过 xsl 转换 xml

标签 xml xslt xpath namespaces xml-namespaces

我使用 IE 11 和 firefox 进行测试

以下运行良好:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="LEDES21Basic.xslt" type="text/xsl"?>
<ledesxml>
  <firm>
      <lf_vendor_id>GB 12 345 6789</lf_vendor_id>
      <lf_id>FR12-3456789</lf_id>
      <lf_name>Alpha &amp; Beta, LLC</lf_name>
</firm>
</ledesxml>

使用以下样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="/ledesxml/firm/lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

但是,我真正的 xml 文件是:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="LEDES21Basic.xslt" type="text/xsl"?>
<ledesxml xmlns="http://www.ledes.org/ledes2000.xsd">
  <firm>
    <lf_vendor_id>GB 12 345 6789</lf_vendor_id>
    <lf_id>FR12-3456789</lf_id>
    <lf_name>Alpha &amp; Beta, LLC</lf_name>
  </firm>
</ledesxml>

您注意命名空间。前面的样式表无法转换 xml。
我尝试了两件事:更改我的 xpath 表达式,使用 xpath-default-namespace 属性:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="t:/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="t:/ledesxml/firm/lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

他们都失败了。
Firefox 说:xpath 表达式分析失败。

====下一次尝试============================================ ============
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="/t:ledesxml/t:firm/t:lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

没有更多的 xpath 错误,但没有预期的结果:lf_name 未转换。

如何在不删除命名空间的情况下转换我的 xml 文件?

最佳答案

xpath-default-namespace仅适用于 XSLT 2.0 处理器,如 Saxon 9、Saxon CE、XmlPrime、Altova,浏览器仅支持 XSLT 1.0。至于使用前缀,是的,这是正确的方法,但正确的语法是为任何元素名称添加前缀,如 <xsl:value-of select="/t:ledesxml/t:firm/t:lf_name"/> .并离开 match="/"实际上,前缀仅用于限定名称。

关于xml - 使用 namespace 通过 xsl 转换 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27444356/

相关文章:

java - Java中XML空元素的输出格式

sql - 如何使用 Oracle SQL 导出 CLOB 列中的 XML 文件

java - android:点击按钮时显示html页面?

java - XSLT 处理巨大的 XML 文件(几乎 5 GB)

python - 选择器response.xpath和response.css之间的输出差异是什么?

xpath - 为什么//*不返回文档节点?

xml - 使用 M2Crypto 从 xml 数据文件生成公钥进行签名验证

XSLT 1.0 添加命名空间 + xsi :type to element

xslt - XSLT 中的动态变量

javascript - 如何删除目标页面中没有 ID 或类名等的 HTML 元素?