我有一个存储在如下变量
中的节点集<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'的值,这两个变量匹配{{1的name属性中的值节点。请帮助我解决方案,我也不想使用exslt或任何其他扩展。
答案 0 :(得分:1)
我的代码检索节点和 它的属性正确。但是 以下代码中的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]"/>
答案 1 :(得分:-1)
使用predicate过滤器将@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>