XSLT 2选择XPath返回布尔值而不是节点

时间:2018-02-18 10:26:32

标签: xml xslt xpath

我多年来一直在打这个,但是找不到答案。 文件是纯文本,我正在'执行MS XmlNotePad中的过程

我正在从外部文件中选择一个带有XPath的节点,但是,当我尝试输出xsl:value-of时,我得到的只是“true”,告诉我节点存在,但不是节点本身。 / p>

问题是,为什么我的变量包含布尔值而不是节点?我也试过不使用var,而只是将路径放在select中,我得到相同的输出“true”。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">
  <xsl:param name="filename" select="'Elements.xml'"/>
  <xsl:param name="ele" select="document($filename)"/>

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

  <!-- find an element by id
  1. replace content inside element with value from xml filename
  2. add an element value  -->
  <xsl:template match="@*|node()">
    <!-- get element id attribute value -->      
     <xsl:copy select=".">
     <xsl:variable name="thisid" select="current()/@id"/>
     <xsl:variable name="eleNode" select="$ele//@id=$thisid"/>
     <xsl:value-of select="$thisid"/>
    <!--<xsl:attribute name="style"><xsl:value-of select="document('Elements.xml')*//@id=$thisid/@style"/></xsl:attribute>-->
    <xsl:choose>
        <xsl:when test="$eleNode">
            <xsl:value-of select="$eleNode"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:otherwise>
    </xsl:choose >
     </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

嗯,$ele//@id=$thisid是一个给出布尔结果的比较表达式。如果您要选择具有特定ID属性的元素,请使用$ele//*[@id = $thisid],如果您要选择ID属性,请使用$ele//@id[. = $thisid]

通常,如果您真的使用XSLT 2处理器,则设置密钥<xsl:key name="id" match="*" use="@id"/>可能更容易,只需检查模板匹配内的引用节点即可。

<xsl:template match="*[@id and key('id', @id, $ele)]">
  <xsl:copy>
    <xsl:value-of select="key('id', @id, $ele)"/>
  </xsl:copy>
</xsl:template>

将替换其他文档包含具有相同id的元素的任何元素的内容以及该引用元素的内容。