在XML路径中查找节点?

时间:2013-11-25 10:22:35

标签: xml xslt xpath

如何获得单个子节点?

<root>
   <p><span>text</span><span>text</span><span>text</span></p>
   <p><span>text</span></p>
   <p><span>text</span><span>text</span><span>text</span></p>
   <p><span>text</span></p>
</root>

例如:/root/p/span

我可以获得所有span标签,我可以找到第一个孩子或最后一个孩子或孩子,但我需要随机找到一个孩子。如何通过XML路径获取para标签?

2 个答案:

答案 0 :(得分:1)

根据您的说明,如果p元素只包含一个span元素,则可以选择这些元素。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="root">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="p[count(span)=1]">
  <xsl:copy>
     <xsl:copy-of select="*|text()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="*"/>

</xsl:stylesheet>

输入我使用过的XML:

<?xml version="1.0" encoding="utf-8"?>

<root>
<p>
  <span>wrong</span>
  <span>wrong</span>
  <span>wrong</span>
</p>
<p>
  <span>right</span>
</p>
<p>
  <span>wrong</span>
  <span>wrong</span>
  <span>wrong</span>
</p>
<p>
  <span>right</span>
</p>
</root>

输出 XML:

<?xml version="1.0" encoding="UTF-8"?>

<p>
  <span>right</span>
</p>

<p>
  <span>right</span>
</p>

答案 1 :(得分:0)

随机选择项目不是标准XSLT的一部分,因为它是一种功能语言。换句话说,无论您尝试多少次,都可以保证您在给定输入时获得相同的输出。

但是,如果随机性对您很重要,请使用XSLT扩展。这里建议回答:

Dimitre的库引用可能正是您所需要的。请注意,随机分配的前提条件是随机数,因此这是讨论的重点。