【问题标题】:XSLT 2 select XPath returning boolean instead of nodeXSLT 2 选择 XPath 返回布尔值而不是节点
【发布时间】:2018-07-28 18:29:20
【问题描述】:

我已经与这个问题斗争了很久,但找不到答案。 文件是纯文本,我正在 MS XmlNotePad 中“执行”该过程

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

问题是,为什么我的变量包含布尔值而不是节点?我也尝试过不使用 var,而是将路径放在选择中,我得到相同的输出“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>

【问题讨论】:

  • 嗯,$ele//@id=$thisid 是一个给出布尔结果的比较表达式。如果要选择具有特定 id 属性的元素,则使用 $ele//*[@id = $thisid],如果要选择 id 属性,则使用 $ele//@id[. = $thisid]
  • 美女!效果很好!我会在教程上发表评论,告诉我这些都是同一件事。你能“回答”,以便我将其标记为正确吗?

标签: xml xslt xpath


【解决方案1】:

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

一般来说,如果您真的使用 XSLT 2 处理器,设置密钥 &lt;xsl:key name="id" match="*" use="@id"/&gt; 并简单地检查模板匹配中的引用节点可能会更容易,例如

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

会将其他文档包含相同 id 元素的任何元素的内容替换为该引用元素的内容。

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2020-02-13
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2022-08-16
    相关资源
    最近更新 更多