如何复制所有消息并使用xslt添加一些字段

时间:2017-01-24 18:57:26

标签: xml xslt soap

我需要复制整个xml邮件并添加一些字段,但在应用xslt时,只复制值而不是标签的名称,请帮助我

这是de input xml

<Xmlroot>
    <headerIn>
        <field1>hello</field1>
        <field2>world</field2>
    </headerIn>
</Xmlroot>

我需要这个回复

<Xmlroot>
    <headerIn>
        <field1>hello</field1>
        <field2>world</field2>
        <other>nice</other>
    </headerIn>
</Xmlroot>

我有这个xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.example.org/tns" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp" exclude-result-prefixes="dp">
  <xsl:output method="xml" omit-xml-declaration="yes"/>


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

    </xsl:template>

</xsl:stylesheet>

我获得此输出

<Xmlroot>
    <headerIn xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.example.org/tns">hello
    world
    </headerIn>
</Xmlroot>

2 个答案:

答案 0 :(得分:0)

下面是一个有效的XSLT,用于转换值和名称。然后,您可以添加要创建的其他输出。我在您的示例中添加了一个额外的元素<other>。保留元素名称的关键是使用{local-name()}

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   version="2.0">
<xsl:output method="xml"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="headerIn">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates/>
      <xsl:element name="other">nice</xsl:element>
  </xsl:element>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

尝试使用此XSL模板复制所有节点,只需在适当的位置添加元素<other>nice</other>

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.example.org/tns" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp" exclude-result-prefixes="dp">
  <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="headerIn">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <other>nice</other>  <!-- replace this line with whatever element you want to add -->
      </xsl:copy>
    </xsl:template>

</xsl:stylesheet>