我需要复制整个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>
答案 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>