如何从节点

时间:2019-02-11 16:39:34

标签: xml xslt

我想从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>

1 个答案:

答案 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()]" />