XML片段:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

我该如何选择已<AA>因为其内容bar的所有子节点?在上面的例子中,我要选择<CC><EE>。我想的解决方案是这样的:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
有帮助吗?

解决方案

<强>一到OP的问题的最简单的解决方案之一是以下XPath表达式

*/*[.='bar']

待办事项,没有XSLT指令是参与 - 这仅仅是一个XPath表达式,所以这个问题只能被标记的XPath

<强>从这里开始,人们可以使用在此XSLT XPath表达式以各种方式,诸如在所有选定节点应用模板。

例如,下面是XSLT转换,是以XML文档,并产生另外一个,其中所有的元素 - <AA>其内容的儿童是不等于"bar"被删除:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

:当这个变换被应用在原始XML文档

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

<强>有用结果产生

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

<强>请注意

在匹配模式,我们通常不需要指定一个绝对XPath表达式,而只是一个相对的一个,所以充分XPath表达式自然简化到该比赛模式:

*[. = 'bar']
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top