Как получить узел из набора узлов, соответствующего значению атрибута? - PullRequest
2 голосов
/ 29 декабря 2010

У меня есть набор узлов, хранящийся в переменной, как показано ниже

<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> узлов в моем наборе узлов, это может вызвать проблемы с производительностью. Мне нужно пересмотреть приведенный ниже код гораздо проще, может быть без для каждого.

<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' в двух разных переменных, которое соответствует значению в атрибуте name <input> узел. Пожалуйста, помогите мне с решением, а также я не хочу использовать exslt или любые другие расширения.

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Мой код ниже извлекает узел и его атрибуты правильно. Но для каждого в приведенном ниже коде повторяется даже после нахождения совпадения, пока достигает последнего узла. Так что если я есть большой список со многими узлы в моем наборе узлов, это может привести к проблема производительности. Мне нужно пересмотреть фактор приведенный ниже код гораздо проще, может быть без для каждого.

<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]"/>
0 голосов
/ 29 декабря 2010

Используйте фильтр предиката для сравнения @name с переменной checkName.

Таблицу стилей можно значительно упростить, удалив 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>
...