在密钥中使用之前,XSLT解析文档($ file)

时间:2014-09-09 14:23:47

标签: xml xslt xslt-2.0

我有一个愚蠢的问题。

我正在加载外部文档,然后使用它将属性添加到主文档中的某个元素。有点像这样:

<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(.,'&amp;')]">
    <xsl:element name="LANG_ENTRY">
        <xsl:value-of select="substring(.,2)"/>
    </xsl:element>
</xsl:template>

但是,如你所知,它现在反对dictstrings变量的声明,说

XTDE0640: Circular variable or parameter declaration

在key()函数中使用它们之前,我应该如何解析和编辑外部文档节点?

我也很担心确保主文档和外部文档之间的上下文正确,但我还没有解决这个问题。

1 个答案:

答案 0 :(得分:0)

你真的不需要&#34;编辑&#34;这样的外部节点,只需确保键定义中的use表达式剥离主前的&符号(如果有的话),当它构造键值时:

<xsl:key name="ui_ids" match="DICT_ENTRY" use="replace(LANG_ENTRY, '^&amp;', '')"/>

(你还没有明确说过,但我假设你已经在XSLT 2.0中使用match模式中的变量和{{1的三参数形式功能)。