xsl基于数值选择节点

时间:2011-07-08 19:49:33

标签: php xml parsing xslt

我有一个xml文档,我试图用xsl设置样式。问题取决于我需要从某个节点提取的值,但在xsl中我不知道如何区分以下两个节点:

XML:

<a number=1>
<car>1</car>
</a>

<a number=2>
<dog>1</dog>
</a>

<I_want_to_display>
<number>2</number>
</I_want_to_display>

XSL:

 <xsl:for-eachselect="I_want_to_display">
      <xsl:if test="number==2">
      ....display everything in <a number=2>
      </xsl:if>

4 个答案:

答案 0 :(得分:1)

不知道你正在寻找什么输出,但这是一个猜测。

这个格式良好的XML输入:

<xml>
  <a number="1">
    <car>1</car>
  </a>

  <a number="2">
    <dog>1</dog>
  </a>

  <I_want_to_display>
    <number>2</number>
  </I_want_to_display>
</xml>

使用此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="I_want_to_display">
    <xsl:variable name="vNbr" select="number/text()"/>
    <xsl:copy-of select="//*[normalize-space(@number) = $vNbr]"/>
  </xsl:template>

</xsl:stylesheet>

生成此输出:

<a number="2">
   <dog>1</dog>
</a>

答案 1 :(得分:1)

使用此XPath单行

/*/*[@number = /*/I_want_to_display/number]

完整的XSLT代码(9行)

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

 <xsl:template match="/">
     <xsl:copy-of select="/*/*[@number = /*/I_want_to_display/number]"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档(因为未提供格式良好的XML文档!):

<t>
    <a number="1">
        <car>1</car>
    </a>
    <a number="2">
        <dog>1</dog>
    </a>
    <I_want_to_display>
        <number>2</number>
    </I_want_to_display>
</t>

产生了想要的正确结果

<a number="2">
   <dog>1</dog>
</a>

解释:XPath运算符=在每个节点对上应用于两个节点集true()(一个来自第一个节点集,另一个来自第一个节点集)第二个节点集),具有相同的字符串值。

答案 2 :(得分:0)

<xsl:for-each select="I_want_to_display">
  <xsl:copy-of select="preceding-sibling::a[@number = current()/number]/node()>
</xsl:for-each>

答案 3 :(得分:0)

您可以使用密钥收集a个节点:

<xsl:key name="ka" match="a" use="@number"/>

并使用密钥稍后引用它们以及所需的模板,例如:

<xsl:for-each select="I_want_to_display">
  <xsl:copy-of select="key('ka',normalize-space(number))"/>
</xsl:for-each>