我有一个愚蠢的问题。
我正在加载外部文档,然后使用它将属性添加到主文档中的某个元素。有点像这样:
<xsl:variable name="dictstrings" select="document($dictionary_file)"/>
<xsl:key name="ui_ids" match="DICT_ENTRY" use="LANG_ENTRY"/>
<!--Identity template, copies all content -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Template for uicontrol that provides custom behavior -->
<xsl:template match="uicontrol[key('ui_ids', ., $dictstrings)]">
<xsl:apply-templates select="key('ui_ids', ., $dictstrings)"/>
</xsl:template>
这会将外部文档中相应的LANG_ENTRY元素与主文档中相应的uicontrol
元素相匹配。 (我有另一个xsl:template
命令添加了DICT_ID属性。)到目前为止一切都很好。
我的问题是有时我的$ dictionary_file中的LANG_ENTRY元素以一个无关的&符号开头。像这样:
<DICT_ENTRY DICT_ID="21625">
<LANG_ENTRY><![CDATA[Test list]]></LANG_ENTRY>
</DICT_ENTRY>
<DICT_ENTRY DICT_ID="2163">
<LANG_ENTRY><![CDATA[&Insert new test]]></LANG_ENTRY>
</DICT_ENTRY>
我想剥掉这个&符号。否则,匹配将无效。
我试图用一种模糊的梦幻阴霾来做这件事:
<xsl:variable name="dictstrings">
<xsl:apply-templates select="document($dictionary_file)"/>
</xsl:variable>
然后有一个捕获LANG_ENTRY的模板
<xsl:template match="LANG_ENTRY[starts-with(.,'&')]">
<xsl:element name="LANG_ENTRY">
<xsl:value-of select="substring(.,2)"/>
</xsl:element>
</xsl:template>
但是,如你所知,它现在反对dictstrings变量的声明,说
XTDE0640: Circular variable or parameter declaration
在key()函数中使用它们之前,我应该如何解析和编辑外部文档节点?
我也很担心确保主文档和外部文档之间的上下文正确,但我还没有解决这个问题。
答案 0 :(得分:0)
你真的不需要&#34;编辑&#34;这样的外部节点,只需确保键定义中的use
表达式剥离主前的&符号(如果有的话),当它构造键值时:
<xsl:key name="ui_ids" match="DICT_ENTRY" use="replace(LANG_ENTRY, '^&', '')"/>
(你还没有明确说过,但我假设你已经在XSLT 2.0中使用match
模式中的变量和{{1的三参数形式功能)。