我有以下xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="somename">
<node1></node1>
<node2></node2>
</lst>
<result name="somename" count="5">
<doc>
<str name="NodeA">ValueA</str>
<str name="NodeB">ValueB</str>
<str name="NodeC">ValueC</str>
</doc>
<doc>
<str name="NodeA">ValueD</str>
<str name="NodeB">ValueE</str>
<str name="NodeC">ValueF</str>
</doc>
</result>
</response>
我想转换为
<?xml version="1.0" encoding="UTF-8"?>
<response>
<doc>
<NodeA>ValueA</NodeA>
<NodeB>ValueB</NodeB>
<NodeC>ValueC</NodeC>
</doc>
<doc>
<NodeA>ValueD</NodeA>
<NodeB>ValueE</NodeB>
<NodeC>ValueF</NodeC>
</doc>
</response>
如您所见,lst节点已完全删除,属性值现已成为节点。
首先,我使用此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" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="lst"/>
</xsl:stylesheet>
给了我这个
<?xml version="1.0" encoding="UTF-8"?>
<response>
<result name="somename" count="5">
<doc>
<str name="NodeA">ValueA</str>
<str name="NodeB">ValueB</str>
<str name="NodeC">ValueC</str>
</doc>
<doc>
<str name="NodeA">ValueD</str>
<str name="NodeB">ValueE</str>
<str name="NodeC">ValueF</str>
</doc>
</result>
</response>
然后使用链接[link] Convert attribute value into element
中的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" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="response/result/doc">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="token">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
但它没有帮助。它给了我这个。
<?xml version="1.0" encoding="utf-8"?>
<doc>ValueAValueBValueC</doc>
<doc>ValueDValueEValueF</doc>
请帮我解决将属性值转换为节点的第二部分。 是否可以让一个xslt做这两件事?
答案 0 :(得分:1)
您可以在一个非常接近当前XSLT的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" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<!-- copy everything as-is apart from exceptions below -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- delete lst -->
<xsl:template match="lst"/>
<!-- strip out the result element but still include its children -->
<xsl:template match="result">
<xsl:apply-templates />
</xsl:template>
<!-- convert str name="X" to X -->
<xsl:template match="str">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
您可以将此作为基础
XSL如何复制除名为注释
之外的所有元素<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:template match="*|/">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- copy xsd:annotation and children, but don't copy the attributes -->
<xsl:template match="xsd:annotation">
<xsd:annotation>
<xsl:copy-of select="*"/>
</xsd:annotation>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
这样做:
<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="node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="lst"/>
<xsl:template match="str[@name]">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行时,会产生:
<response>
<result>
<doc>
<NodeA>ValueA</NodeA>
<NodeB>ValueB</NodeB>
<NodeC>ValueC</NodeC>
</doc>
<doc>
<NodeA>ValueD</NodeA>
<NodeB>ValueE</NodeB>
<NodeC>ValueF</NodeC>
</doc>
</result>
</response>