我是xsl的新手,需要帮助:(。我需要将子节点作为父笔记的值。
<planet>
<venus> sometext
<mass>123</mass>
</venus>
<mars>text about mars</mars>
</planet>
所以我必须以这种形式得到它:
<venus>sometext
<mass>123</mass>
</venus>
<mars> text about mars <mars>
节点必须在符号“&lt;”内和“&gt;”因为编译认为它们是父母笔记的内容。 感谢!!!
答案 0 :(得分:2)
<?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:for-each select="*">
<xsl:apply-templates select="@*|node()"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="planet">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<planet>
<venus> sometext
<mass>123</mass>
</venus>
<mars>text about mars</mars>
</planet>
会产生想要的正确结果:
<venus> sometext
<mass>123</mass>
</venus>
<mars>text about mars</mars>
第二种解决方案 - 更直接,更短:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select="node()"/>
</xsl:template>
</xsl:stylesheet>
解释:
在这两种解决方案中,我们都避免复制元素树的根,并复制其子树。
在第一个解决方案中,复制子树是 identity rule 的效果 - 如果将来我们改变计划并决定不仅仅复制,这将为我们提供更大的灵活性子树的节点,但要转换它们中的一些或全部。
在第二个解决方案中,使用单个XSLT指令(<xsl:copy-of>
)完成复制。在这里,我们交换灵活性以提高速度和紧凑性。