Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt-如何检查具有特定路径名的孙子节点。(xpath 1.0)_Xslt_Xpath_Xpath 1.0 - Fatal编程技术网

Xslt-如何检查具有特定路径名的孙子节点。(xpath 1.0)

Xslt-如何检查具有特定路径名的孙子节点。(xpath 1.0),xslt,xpath,xpath-1.0,Xslt,Xpath,Xpath 1.0,我想做的是给一个元素作为上下文,我想确定它是否有一个具有给定名称的子元素,并确定该子元素是否有一个具有给定名称的节点,以便我可以对其进行操作。使用XPath 1.0语法执行此操作非常重要 到目前为止,我得到的代码是这样的 <xsl:for-each select="child::*"> <xsl:if test="contains(name(), 'description')"> <xsl:for-each select="child::*">

我想做的是给一个元素作为上下文,我想确定它是否有一个具有给定名称的子元素,并确定该子元素是否有一个具有给定名称的节点,以便我可以对其进行操作。使用XPath 1.0语法执行此操作非常重要

到目前为止,我得到的代码是这样的

<xsl:for-each select="child::*">
  <xsl:if test="contains(name(), 'description')">
    <xsl:for-each select="child::*">
      <xsl:if test="contains(name(), 'text')">
        <xsl:value-of select="node()"/>
      </xsl:if>
</xsl:for-each>
  </xsl:if>
</xsl:for-each>

它是有效的,但它又大又丑,我知道有一种方法可以浓缩它。其中的for each是不必要的,因为我只希望有一个子节点被命名为description,并且它只有一个文本节点

我觉得这个解决方案应该有效

<xsl:for-each select="./description/text">
  ..
</xsl:for-each>

..
但事实并非如此,而且我对XPath语法还不够精通,不知道为什么

我问这个问题的原因是,虽然我已经找到了检测子节点是否有名称的答案,并且找到了可以访问该子节点上下文的答案,但我还没有找到将两者结合在一起的答案,尽管可能我只是搜索得不够努力,在这种情况下,我道歉

编辑:Woops,抱歉是的,我忘了提到代码的contains()部分也是一个黑客行为,因为我不确定如何将它们的值与相等值进行比较

同样,只要答案在那里,
也不起作用

有问题的XML示例如下

<leaf>
  <description>
    <text> Various Words
    </text>
  </description>
</leaf>

各种各样的词
其中,上下文是叶,我正试图访问文本节点

编辑:第二次来:

我的问题是,我的XSLT文件使用的是默认名称空间(在我的示例中,名称为a)。如果我加上这一点,那么博罗丁的回答应该是正确的

具体来说,这就是最终为我工作的代码,以防有人想知道

<xsl:for-each select="a:description/a:text>
  <xsl:value-of select="node()"/>
</xsl:for-each>

是否确实要检查元素名称是否包含这些字符串?或者,正如您的叙述所说,您希望元素具有确切的名称吗

要完成类似于您已经编写的内容,请使用

<xsl:for-each select="*[contains(name(), 'description')]/*[contains(name(), 'text')]">
  <xsl:value-of select="node()"/>
</xsl:for-each>

您能添加相应的XML吗?我想您的XML中有一个默认名称空间。如果这是真的,则必须将此名称空间(带有新前缀)添加到xlst。然后在节点mame中使用此前缀。像
p:description/p:text
@hr_117-有没有办法接受评论?哈哈。抱歉,我是XSLT新手,不知道这是什么relevant@dcco:这就是为什么在提出问题时显示实际数据很重要的原因。@dcco:对不起,我们需要查看实际数据。正如我在我的答案的一个补充部分中所展示的那样,您所展示的工作很好。确实如此,我只是在名称空间方面遇到了一个问题,它似乎是XP。不幸的是,我无法复制实际数据,因为它是专有信息,我不确定要删除多少才能不被复制。我可能不会想到提到名称空间,因为我一开始不知道它们是什么。不过,感谢您提供有关模板应用程序的提示。:)
<xsl:for-each select="description/text">
  <xsl:value-of select="node()"/>
</xsl:for-each>
<leaf>
  <description>
    <text>Various Words</text>
  </description>
  <description>
    <text>More Words</text>
  </description>
  <description>
    <text>Other Words</text>
  </description>
</leaf>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/leaf">
    <xsl:for-each select="description/text">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/leaf">
    <xsl:apply-templates select="description/text"/>
  </xsl:template>

  <xsl:template match="text">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>