XPath表达式忽略子节点

时间:2014-05-09 08:13:58

标签: xml xpath

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <folder>
      <TestOne>F</TestOne>
      <TestTwo>01</TestTwo>
      <case>
         <CRDATTIM>2014-03-26-05.22.22.339840</CRDATTIM>
         <RECORDCD>C</RECORDCD>
      </case>
      <case>
         <CRDATTIM>2014-03-26-05.05.51.531840</CRDATTIM>
         <RECORDCD>C</RECORDCD>
      </case>
   </folder>
</response>

我需要XPath表达式来立即读取<folder>标记下的节点及其值。我不需要子节点信息。我的意思是,我提取的信息应如下所示:

<folder>
<TestOne>F</TestOne>
<TestTwo>01</TestTwo>
<folder>

此处<folder>下列出的标签名称,即<TestOne>, <TestTwo>是动态的。

有没有办法为上述要求派生XPath表达式?如果我的问题不明确,请告诉我。提前谢谢。

3 个答案:

答案 0 :(得分:3)

这是一个仅输出<folder>节点的直接子节点的模板:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/response/folder">
        <folder>
            <xsl:apply-templates select="node()" mode="childs"/>
        </folder>
    </xsl:template>
    <xsl:template match="*" mode="childs">
        <xsl:if test="count(./text()) = 1">
            <xsl:element name="{local-name()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

如果你刚刚在xpath之后获取文件夹节点中的所有节点:

/response/folder/node()[count(text()) = 1]

答案 1 :(得分:1)

您是否尝试过count方法?

/response/folder/*[count(*)=0]

答案 2 :(得分:0)

XPath是一种从XML树中选择特定节点的方法,但它本身不能更改任何节点的内容。如果使用表达式选择folder元素

/response/folder

然后你会得到整个元素,包括case个孩子。您可以使用

选择folder下的“叶子”元素
/response/folder/*[not(*)]

会为您提供包含两个元素(TestOneTestTwo)的节点集,但会将这两个元素组合成 new folder元素不是XPath可以为你做的事情。您必须使用您用来评估XPath表达式的语言/工具提供的任何工具来自己完成。