【问题标题】:Replace namespace prefixes with scoped default namespaces using XSLT使用 XSLT 将命名空间前缀替换为作用域默认命名空间
【发布时间】:2012-06-08 09:17:49
【问题描述】:

你能和我分享一个实现以下功能的 XSLT 吗?

输入:

<alfa data="abc" xmlns="http://test1.com/">
  <mus:beta xmlns:mus="http://test2.com">
    <mus:a>1234567897</mus:a>
    <mus:s>777666</mus:s>
  </mus:beta>
</alfa>

输出应该是:

<alfa data="abc" xmlns="http://test1.com/">
  <beta xmlns="http://test2.com">
    <a>1234567897</a>
    <s>777666</s>
  </beta>
</alfa>

事实上;输入是用 XmlBeans 生成的;我无法用 xmlbeans 实现输出;所以我将在调解中使用 xslt 进行转换;但是我首先需要一个 xslt :) XmlBeans 解决方案也是可以接受的。 :)

对于 xmlbeans 用户;以下不起作用,仅供参考:

Map map = new HashMap();
 map.put("http://test1.com/",""); 
 map.put("http://test2.com/","");
 xo.setSaveSuggestedPrefixes(map);

干杯, 卡安

【问题讨论】:

    标签: xslt xmlbeans


    【解决方案1】:

    这是一个样式表:

    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:mus="http://test2.com"
      exclude-result-prefixes="mus"
      version="1.0">
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="mus:*">
      <xsl:element name="{local-name()}" namespace="namespace-uri()}">
         <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 谢谢马丁!请注意语法错误:namespace="{namespace-uri(.)}"。对于 Java 开发人员:Xalan 没有给出正确的转换;但是撒克逊人确实如此。 Stylus Studio 也适用于这个 xsl。所以我认为 Xalan 有一些令人困惑的地方:配置或错误;我不知道。
    【解决方案2】:

    如果您向文档显式添加命名空间声明,XmlBeans 将尊重它。您可以使用XmlCursor API 添加新的默认命名空间中间文档。例如,

        XmlObject xobj = XmlObject.Factory.parse(
                "<a xmlns='testA'>\n" +
                "  <B:b xmlns:B='testB'>\n" +
                "    <B:x>12345</B:x>\n" +
                "  </B:b>\n" +
                "</a>");
    
        // Use xpath with namespace declaration to find <B:b> element.
        XmlObject bobj = xobj.selectPath(
                "declare namespace B='testB'" +
                ".//B:b")[0];
    
        XmlCursor cur = null;
        try
        {
            cur = bobj.newCursor();
            cur.removeAttribute(new QName("http://www.w3.org/2000/xmlns/", "B"));
            cur.toNextToken();
            cur.insertNamespace("", "testB");
        }
        finally
        {
            cur.dispose();
        }
    
        System.out.println(xobj.xmlText());
    

    【讨论】:

    • 不错!可以跳过 selectPath() 步骤吗?
    • 是的,可以跳过。如果您手头已经有一个 XmlObject,那么就使用它。我只是使用 selectPath() 来快速抓取所需的 XmlObject。
    • 谢谢。我实际上需要 selectPath() 查询,但有一个 default 命名空间,I did not find the proper syntax。有没有办法做到这一点?
    • 我已经回答了链接的问题,但简而言之:在 xpath 表达式中使用 declare namespace B=''
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多