我有一个XML文件,它有许多名称相似的节点,但某些节点中的属性是唯一的。我只想将属于某个属性值的节点输出到HTML页面中。
这是xml:
<document>
<component>
<section>
<templateId value="temp_1" />
<entry>
<act>
<code displayName="temp_1:code_1" />
</act>
</entry>
<entry>
<act>
<code displayName="temp_1:code_2" />
</act>
</entry>
<entry>
<act>
<code displayName="temp_1:code_3" />
</act>
</entry>
</section>
<section>
<templateId value="temp_2" />
<entry>
<act>
<code displayName="temp_2:code_1" />
</act>
</entry>
<entry>
<act>
<code displayName="temp_2:code_2" />
</act>
</entry>
</section>
</component>
</document>
从这个特定的例子中,我只想从templateId值为temp_2的部分获得displayName值。这是我正在使用的XSL代码,但它得到了一切,而不仅仅是我想要的部分。我知道第一个"when"是有效的,因为右边的标题(在span标记之间)显示正确。这只是每个条目的。
<xsl:tempalte match="/">
<xsl:choose>
<xsl:when test="//templateId/@value='temp_2'">
<div style="margin-bottom: 5px; padding: 5px; border-bottom: 1px solid #000000;">
<span style="font-weight: bold;">Template 2: </span>
<br />
<xsl:choose>
<xsl:when test="count(//section/entry) != 0">
<xsl:for-each select="//section/entry">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:value-of select="act/code/@displayName" />
</xsl:when>
<xsl:otherwise>
<br/>
<xsl:value-of select="act/code/@displayName" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
No codes to display
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:when>
</xsl:choose>
</xsl:template>
它应该这样显示:
temp_2:code_1
<br>temp_2:code_2
如有任何帮助,我们将不胜感激。
我想您想彻底重新研究XSLT及其原理。不要像BASIC那样编程。至少在您的案例中,基本模式是XSLT程序是处理匹配元素的模板集合。不要在代码中乱丢if
和choose
,而是编写具有适当匹配条件的模板。使用<xsl:apply-templates/>
来"迭代"子级,而不是BASIC的FOR I=1 TO 10
。以下是基本思想:
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="templateId"/> <!-- skip templateID elements by default -->
<xsl:template match="templateId[@value='temp_2']">
<div style="margin-bottom: 5px; padding: 5px; border-bottom: 1px solid #000000;">
<span style="font-weight: bold;">Template 2: </span>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="code">
<xsl:value-of select="@displayName"/>
<xsl:if test="position() != 1"><br/></xsl:if>
</xsl:template>
<xsl:template match="section[count(entry)=0]">
No codes to display
</xsl:template>
为什么act
元素没有模板?默认情况下,XSLT将为您提供一个执行<xsl:apply-templates/>
的模板。
根据您的描述,听起来您只需要在for each中输入temp_2值。
在这种情况下,您可以将您的选择更新为以下内容:
<xsl:for-each select="//section[templateId/@value = 'temp_2']/entry">
这意味着获取section
下的任何entry
,该templateId
的属性为value
,等于"temp_2"。