【发布时间】: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]。 -
美女!效果很好!我会在教程上发表评论,告诉我这些都是同一件事。你能“回答”,以便我将其标记为正确吗?