我想从XML中提取具有所有值及其元素的子元素
Child:node():-不返回结果 child :: *-获得第一个元素的值
示例XML
<testdata>
<Name>
<Name1>Rahul</Name1>
<Name2>Rahul</Name2>
<Name3>Rahul</Name3>
<Name4>Rahul</Name4>
<Name5>Rahul</Name5>
<Name6>Rahul</Name6>
<Name>
<testdata>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:Util="urn:Util" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs msxsl xsl Util">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
<xsl:template match="testdata">
<DummyallMane>
<xsl:value-of select="//testdata/name/child::node()
</xsl:template>
预期结果
<Name1>Rahul</Name1>
<Name2>Rahul</Name2>
<Name3>Rahul</Name3>
<Name4>Rahul</Name4>
<Name5>Rahul</Name5>
答案 0 :(得分:1)
首先,您正在使用xsl:value-of
,它仅返回节点的文本值。您应该在此处使用xsl:copy-of
来复制节点本身。
此外,在XSLT 1.0中,如果在多个节点上使用xsl:value-of
,它将仅返回第一个的值(这就是child:*
仅在{{1 }})。请注意,xsl:value-of
不返回任何内容,因为child::node()
还会选择文本节点,因此它将在node()
之前拾取空白节点。 (如果您已将Name1
添加到您的节点,那么您将获得结果)。
所以,您应该这样做...
xsl:strip-space
(还要注意,XSLT区分大小写,因此<xsl:copy-of select="Name/*" />
实际上不会选择name
)
看到它在这里工作... http://xsltfiddle.liberty-development.net/gWvjQeZ
注意,我假设Name
也应该在您的预期结果中。但是,如果您确实想排除最后一个节点,则可以执行此操作...
Name6
或者这样,以排除具有给定名称的节点
<xsl:copy-of select="Name/*[position() != last()]" />