2

我有一个节点集存储在一个变量中,如下所示

<xsl:variable name="myXML">
<list>
<input name="First" elementName="FirstName" option="one" />
<input name="Second" elementName="SecondName" option="Two" />
<input name="Third" elementName="ThirdName" option="Three" />
<input name="Fourth" elementName="FourthName" option="Four" />
</list>
</xsl:variable>

我下面的代码正确检索节点及其属性。但是即使在找到匹配项之后,下面代码中的 for-each 也会重复,直到到达最后一个<input>节点。<input>因此,如果我的节点集中有一个包含许多节点的大列表,则可能会导致性能问题。我需要更简单地重构下面的代码,可能没有 for-each。

<xsl:template match="/">
<xsl:variable name="checkName" select="'Third'" />
<xsl:variable name="getNode">
<xsl:for-each select="$myXML/list/input">
    <xsl:if test="./@name=$checkName">
    <xsl:copy-of select="." />
    </xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="element" select="$getNode/input/@elementName" />
<xsl:variable name="option" select="$getNode/input/@option" />
<element><xsl:value-of select="$element" /></element>
<option><xsl:value-of select="$option" /></option>
</xsl:template>

我想要的是,我有一个输入变量 checkName="Third",我需要两个不同变量中的属性“elementName”和“option”的值,这些变量与<input>节点的 name 属性中的值相匹配。请帮助我解决方案,我也不想使用 exslt 或任何其他扩展。

4

2 回答 2

1

我下面的代码正确检索节点及其属性。但是即使在找到匹配项之后,下面代码中的 for-each 也会重复,直到到达最后一个节点。因此,如果我的节点集中有一个包含许多节点的大列表,则可能会导致性能问题。我需要更简单地重构下面的代码,可能没有 for-each。

<xsl:variable name="getNode">
 <xsl:for-each select="$myXML/list/input">
     <xsl:if test="./@name=$checkName">
       <xsl:copy-of select="." />     
     </xsl:if> 
 </xsl:for-each> 
</xsl:variable>

使用

<xsl:variable name="getNode" select="$myXml/list/input[@name=$checkName]"/>
于 2010-12-29T17:02:57.523 回答
-1

使用谓词过滤器将@namecheckName变量进行比较。

for-each通过删除和额外的变量来使用简单的 XPATH 语句,可以大大简化样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:variable name="myXML">
        <list>
            <input name="First" elementName="FirstName" option="one" />
            <input name="Second" elementName="SecondName" option="Two" />
            <input name="Third" elementName="ThirdName" option="Three" />
            <input name="Fourth" elementName="FourthName" option="Four" />
        </list>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:variable name="checkName" select="'Third'" />
        <element><xsl:value-of select="$myXML/list/input[@name=$checkName]/@elementName" /></element>
        <option><xsl:value-of select="$myXML/list/input[@name=$checkName]/@option" /></option>
    </xsl:template>
</xsl:stylesheet>
于 2010-12-29T17:04:46.030 回答