xsl:删除命名空间然后转换元素 [英] xsl: remove namespaces then transform elements

查看:39
本文介绍了xsl:删除命名空间然后转换元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的 XML:input.xml

I have a XML like this: input.xml

<?xml version="1.0" encoding="UTF-8"?>
<somens:Root xmlns:somens="http://url/of/some/namespace">
  <somens:Child>
    <somens:String>some value here</somens:String>
    <somens:Integer>123456</somens:Integer>
    <somens:Date>1990-01-01 00:00:00</somens:Date>
    <somens:Element>
      <somens:name>foo</somens:name>
      <somens:value>foo</somens:value>
    </somens:Element>
    <somens:Element>
      <somens:name>foo</somens:name>
      <somens:value>bar</somens:value>
    </somens:Element>
    <somens:Element>
      <somens:name>bar</somens:name>
      <somens:value>bar</somens:value>
    </somens:Element>
  </somens:Child>
</somens:Root>

然后应该:

  • 删除所有命名空间
  • transform foofoofoo;bar</value></Element><Element><foo>foo</foo><foo>bar</foo></Element>

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Child>
    <String>some value here</String>
    <Integer>123456</Integer>
    <Date>1990-01-01 00:00:00</Date>
    <Element>
      <foo>foo</foo>
      <foo>bar</foo>
      <bar>bar</bar>
    </Element>
  </Child>
</Root>

我可以像这样使用 xslt 删除命名空间:

I can remove namespaces with xslt like this:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="*">
    <!-- remove element prefix -->
    <xsl:element name="{local-name()}">
      <!-- process attributes -->
      <xsl:for-each select="@*">
        <!-- remove attribute prefix -->
        <xsl:attribute name="{local-name()}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

然后用这个 xslt 转换 Elements:

And then transform Elements with this xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="//Element">
      <xsl:element name="{./name}">
      <xsl:value-of select="./value"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

得到这样的xml:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Child>
    <String>some value here</String>
    <Integer>123456</Integer>
    <Date>1990-01-01 00:00:00</Date>
    <foo>foo</foo>
    <foo>bar</foo>
    <bar>bar</bar>
  </Child>
</Root>

但我不明白我怎么能:

  1. 使用单个 xslt 进行所有转换

  1. make all transformation with single xslt

从所有 Element 中剪切子元素并将它们应用到单个 Element

cut childrens from all Elements and apply them into single Element

推荐答案

找到解决方案!

谢谢@michael.hor257k

Solution found!

Thanks @michael.hor257k

transform.xsl

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- move all elements to no-namespace -->
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="*[*[local-name()='Element']]">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="*[not(local-name()='Element')]"/>
        <Element>
            <xsl:apply-templates select="*[local-name()='Element']"/>
        </Element>
    </xsl:element>
</xsl:template>

<xsl:template match="*[local-name()='Element']">
    <xsl:element name="{*[local-name()='name']}">
        <xsl:value-of select="*[local-name()='value']"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

这篇关于xsl:删除命名空间然后转换元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆