【问题标题】:XSLT for XML containing multiple namespacesXSLT for XML 包含多个名称空间
【发布时间】:2012-04-20 02:59:01
【问题描述】:

我正在研究一个让我有点头疼的 XSLT,并且正在寻找一些技巧。我正在转换一个 XML,其中一些标签具有命名空间前缀,而另一些则没有。我正在努力将所有标签转换为一个通用的命名空间前缀。

XML 示例:

<yes:Books>
   <no:Book>
      <Title>Yes</Title>
      <maybe:Version>1</maybe:Version>
   </no:Book>
</yes:Books>

我想得到什么:

<yes:Books>
   <yes:Book>
      <yes:Title>Yes</yes:Title>
      <yes:Version>1</yes:Version>
   </yes:Book>
</yes:Books>

XML 输入是几个 Web 服务的集合,它们返回不同的命名空间。我没有问题将它适当地聚合在一起,它正在创建一个我遇到问题的公共前缀命名空间。

最坏的情况,我可以用正则表达式去掉它们,但我确定不推荐这样做。

谢谢。

【问题讨论】:

    标签: java xml xslt


    【解决方案1】:

    此转换允许将所需的最终前缀及其命名空间指定为外部/全局参数。它显示了如何以相同的方式处理属性名称

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:param name="pPrefix" select="'yes'"/>
     <xsl:param name="pNamespace" select="'yes'"/>
    
     <xsl:template match="*">
      <xsl:element name="{$pPrefix}:{local-name()}" namespace="{$pNamespace}">
       <xsl:apply-templates select="node()|@*"/>
      </xsl:element>
     </xsl:template>
    
     <xsl:template match="@*">
      <xsl:attribute name="{$pPrefix}:{local-name()}" namespace="{$pNamespace}">
       <xsl:value-of select="."/>
      </xsl:attribute>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于以下文档时(提供的带有一个附加属性以使问题更具挑战性):

    <yes:Books xmlns:yes="yes">
        <no:Book xmlns:no="no">
            <Title no:Major="true">Yes</Title>
            <maybe:Version xmlns:maybe="maybe">1</maybe:Version>
        </no:Book>
    </yes:Books>
    

    产生想要的正确结果:

    <yes:Books xmlns:yes="yes">
       <yes:Book>
          <yes:Title yes:Major="true">Yes</yes:Title>
          <yes:Version>1</yes:Version>
       </yes:Book>
    </yes:Books>
    

    【讨论】:

      【解决方案2】:
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:custom="c">
          <xsl:template match="/">
              <xsl:copy>
                  <xsl:apply-templates select="node()|@*"/>
              </xsl:copy>
          </xsl:template>
          <xsl:template match="*">
              <xsl:element name="custom:{local-name()}" namespace-uri="c">
                  <xsl:apply-templates/>
              </xsl:element>
          </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

      • 这种转换在一般情况下有问题。属性被删除。
      猜你喜欢
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2019-11-26
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多