XSLT以获取具有特定值的节点的父节点

时间:2012-01-22 23:46:16

标签: xslt

根据子项的值获取父节点的XSLT是什么?

我的xml:

<cast>
  <character>
    <name>Bugs</name>
    <id>1</id>
  </character>
  <character>
    <name>Daffy</name>
    <id>2</id>
  </character>

我试过这个:

<xsl:template match="/cast/character/id">
    <xsl:if test="text()=1">
        <xsl:apply-templates select="../self" mode='copier'/>
    </xsl:if>
</xsl:template>

<xsl:template match="*" mode='copier'>
    <xsl:apply-templates />
</xsl:template>

但是这会输出文档中每个节点的文本。

编辑:我必须在这里输出XML,我打算将其扩展到XML生成

3 个答案:

答案 0 :(得分:1)

我相信您正在打印所有内容,因为处理器在根目录开始匹配,而您指定的唯一模板是id元素,因此默认情况下会复制内容。试试这个:

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <output method="text" />
    <template match="/">
        <apply-templates select="//id" />
    </template>
    <template match="id">
        <if test="text()='1'">
            <value-of select=".." />
        </if>
    </template>
</stylesheet>

或者,如果您只想要字符名称,则可以将select元素中的value-of属性值替换为“../name”。

答案 1 :(得分:1)

只需使用

<xsl:apply-templates select="/*/character[id=1]"/>

或者,如果只需复制所需节点而不进行进一步处理

<xsl:copy-of select="/*/character[id=1]"/>

答案 2 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/cast/character">
     <xsl:if test="id=1">
        <xsl:copy-of select="." />
     </xsl:if>
  </xsl:template>
</xsl:stylesheet>

无法添加评论。因此把它放在这里