我多年来一直在打这个,但是找不到答案。 文件是纯文本,我正在'执行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>
答案 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的元素的任何元素的内容以及该引用元素的内容。