XSLT从元素中删除前缀,但从根节点除外

时间:2016-07-20 20:24:00

标签: xslt

如何从所有元素中删除前缀urn,从根节点开始?

XML输入

<urn:client xmlns:urn='www.testing.com' xmlns:x='http://schemas.xmlsoap.org/soap/envelope/'>
    <urn:header>
        <urn:desc1>undefined</urn:desc1>
        <urn:desc2>undefined</urn:desc2> 
    </urn:header>
    <urn:itens1>
        <urn:item1>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item1>
    </urn:itens1>
    <urn:itens2>
        <urn:item1>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item1>
        <urn:item2>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item2>
    </urn:itens2>
</urn:client>

XML输出

<urn:client xmlns:urn='www.testing.com' xmlns:x='http://schemas.xmlsoap.org/soap/envelope/'>
    <header>
        <desc1>undefined</desc1>
        <desc2>undefined</desc2> 
    </header>
    <itens1>
        <item1>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item1>
    </itens1>
    <itens2>
        <item1>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item1>
        <item2>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item2>
    </itens2>
</urn:client>

我尝试使用以下XSLT代码

    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*">
    <xsl:element name="{local-name(.)}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="@*">
    <xsl:attribute name="{local-name(.)}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

但是,根节点的前缀和命名空间也将被删除。

你们有什么想法吗?

韩国社交协会

1 个答案:

答案 0 :(得分:1)

怎么样:

import React from 'react';
import { connect } from 'react-redux';
import {action} from './actions.js';

import MyDumbComponent from './myDumbComponent.jsx';

function mapStateToProps(state)
{
  return { something: state.xxxreducer.something  };
}

function mapDispatchToProps(dispatch)
{
  return { 
       doAction: ()=>{dispatch(action())}
  };
}

const MyDumbComponentContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(MyDumbComponent);

// Uh... how can I hook into to componentDidMount()? This isn't 
// a normal React class.

export default MyDumbComponentContainer;

这假定输入XML中的属性在非命名空间中(通常是这样)。实际上,给定的示例根本没有属性 - 因此您可以完全删除<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="*"/> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="/*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet> 指令。