为什么我的 XSL 样式表 for-each 不起作用,重复文本
Why is my XSL stylesheet for-each not functioning, repeats text
我已经查看了可能已有您的答案部分的问题,但解决方案无效。
我是 XML 样式表的新手,我有一个 XSL 并且在我的 for each 循环中,当我试图获取标签中的所有文本时,数据不断重复。它的计数(父标签中值的数量)准确,但只打印相同的文本。
有什么想法吗?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/programming/languages/language">
<h3>=======Programming Language <xsl:value-of select="./@id" />=======</h3>
<p>Language: <xsl:value-of select="name" /></p>
Intended Use:
<xsl:variable name="intendedUseID" select="purpose/intendedUse/@id" />
<xsl:for-each select="/programming/purpose/intendedUse[@id=$intendedUseID]" >
<xsl:value-of select="/programming/purpose/intendedUse" />
</xsl:for-each>
<br />
<xsl:variable name="featureID" select="features/feature/@id" />
<xsl:for-each select="/programming/features/feature[@id=$featureID]">
<xsl:value-of select="/programming/features/feature" /><br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XML
<programming>
<languages>
<language id="1">
<name>C</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
<intendedUse id="3" />
<intendedUse id="4" />
</purpose>
<features>
<feature id="1" />
<feature id="4" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
</standards>
</language>
<language id="2">
<name>C++</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="4" />
<feature id="5" />
</features>
<standards>
<standard id="2" />
</standards>
</language>
<language id="3">
<name>C#</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="5" />
<intendedUse id="6" />
<intendedUse id="7" />
<intendedUse id="3" />
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="4" />
<feature id="5" />
<feature id="6" />
<feature id="7" />
</features>
<standards>
<standard id="3" />
<standard id="2" />
</standards>
</language>
<language id="4">
<name>Java</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="6" />
<intendedUse id="7" />
<intendedUse id="3" />
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="5" />
<feature id="6" />
</features>
<standards>
<standard id="4" />
</standards>
</language>
<language id="5">
<name>JavaScript</name>
<purpose>
<intendedUse id="7" />
<intendedUse id="8" />
<intendedUse id="7" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="6" />
</features>
<standards>
<standard id="3" />
</standards>
</language>
<language id="6">
<name>PHP</name>
<purpose>
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="4" />
<feature id="6" />
</features>
<standards>
<standard id="5" />
</standards>
</language>
<language id="7">
<name>Python</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="3" />
<intendedUse id="9" />
<intendedUse id="10" />
<intendedUse id="11" />
<intendedUse id="12" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="6" />
</features>
<standards>
<standard id="5" />
</standards>
</language>
<language id="8">
<name>Basic</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="13" />
</purpose>
<features>
<feature id="1" />
<feature id="4" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
</standards>
</language>
<language id="9">
<name>ADA</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
<intendedUse id="14" />
<intendedUse id="15" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="4" />
<feature id="5" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
<standard id="6" />
</standards>
</language>
<language id="10">
<name>ActionScript 3.0</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="7" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="7" />
</features>
<standards>
<standard id="3" />
</standards>
</language>
</languages>
<purpose>
<intendedUse id="1"> Application</intendedUse>
<intendedUse id="2"> System </intendedUse>
<intendedUse id="3"> General Purpose </intendedUse>
<intendedUse id="4"> Low-Level Operations </intendedUse>
<intendedUse id="5"> RAD </intendedUse>
<intendedUse id="6"> Business </intendedUse>
<intendedUse id="7"> Client-Side </intendedUse>
<intendedUse id="8"> Server-Side </intendedUse>
<intendedUse id="9"> Web </intendedUse>
<intendedUse id="10"> Scripting </intendedUse>
<intendedUse id="11"> AI </intendedUse>
<intendedUse id="12"> Scientific Computing </intendedUse>
<intendedUse id="13">Education</intendedUse>
<intendedUse id="14">Embedded</intendedUse>
<intendedUse id="15">RealTime</intendedUse>
</purpose>
<features>
<feature id="1">Imperative </feature>
<feature id="2">Object-Oriented</feature>
<feature id="3">Functional</feature>
<feature id="4">Procedural</feature>
<feature id="5">Generic</feature>
<feature id="6">Reflective</feature>
<feature id="7">Event-Driven</feature>
</features>
<standards>
<standard id="1">ANSI</standard>
<standard id="2">ISO</standard>
<standard id="3">ECMA</standard>
<standard id="4">DE FACTO</standard>
<standard id="5">NO</standard>
<standard id="6">GOST</standard>
</standards>
</programming>
这是打印出来的
=======编程语言1=======
语言:C
预期用途:应用程序应用程序应用程序
至关重要的
命令式
=======编程语言2=======
语言:C++
预期用途:应用程序
势在必行
至关重要的
至关重要的
至关重要的
势在必行
第一件事:
<xsl:for-each select="/programming/purpose/intendedUse[@id=$intendedUseID]" >
将您置于 intendedUse
的背景下。从这个上下文中,您只需要通过执行以下操作来获取当前节点的值:
<xsl:value-of select="." />
你的方式:
<xsl:value-of select="/programming/purpose/intendedUse" />
返回根并选择此路径上的第一个节点。
第二件事是,当您的第一个也是唯一一个模板在输入树的中间开始时,更高层的节点及其后代将由 built-in template rules 处理。
结果,您将在结果中积累大量垃圾文本,因为默认情况下,所有文本节点都被复制到输出树。你应该让你的第一个模板匹配根节点:
<xsl:template match="/">
并更改包含的路径以从那里开始。
最后,您应该考虑使用 keys 从文档的其他分支查找数据:它也更整洁、更高效。
我已经查看了可能已有您的答案部分的问题,但解决方案无效。
我是 XML 样式表的新手,我有一个 XSL 并且在我的 for each 循环中,当我试图获取标签中的所有文本时,数据不断重复。它的计数(父标签中值的数量)准确,但只打印相同的文本。
有什么想法吗?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/programming/languages/language">
<h3>=======Programming Language <xsl:value-of select="./@id" />=======</h3>
<p>Language: <xsl:value-of select="name" /></p>
Intended Use:
<xsl:variable name="intendedUseID" select="purpose/intendedUse/@id" />
<xsl:for-each select="/programming/purpose/intendedUse[@id=$intendedUseID]" >
<xsl:value-of select="/programming/purpose/intendedUse" />
</xsl:for-each>
<br />
<xsl:variable name="featureID" select="features/feature/@id" />
<xsl:for-each select="/programming/features/feature[@id=$featureID]">
<xsl:value-of select="/programming/features/feature" /><br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XML
<programming>
<languages>
<language id="1">
<name>C</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
<intendedUse id="3" />
<intendedUse id="4" />
</purpose>
<features>
<feature id="1" />
<feature id="4" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
</standards>
</language>
<language id="2">
<name>C++</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="4" />
<feature id="5" />
</features>
<standards>
<standard id="2" />
</standards>
</language>
<language id="3">
<name>C#</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="5" />
<intendedUse id="6" />
<intendedUse id="7" />
<intendedUse id="3" />
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="4" />
<feature id="5" />
<feature id="6" />
<feature id="7" />
</features>
<standards>
<standard id="3" />
<standard id="2" />
</standards>
</language>
<language id="4">
<name>Java</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="6" />
<intendedUse id="7" />
<intendedUse id="3" />
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="5" />
<feature id="6" />
</features>
<standards>
<standard id="4" />
</standards>
</language>
<language id="5">
<name>JavaScript</name>
<purpose>
<intendedUse id="7" />
<intendedUse id="8" />
<intendedUse id="7" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="6" />
</features>
<standards>
<standard id="3" />
</standards>
</language>
<language id="6">
<name>PHP</name>
<purpose>
<intendedUse id="8" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="4" />
<feature id="6" />
</features>
<standards>
<standard id="5" />
</standards>
</language>
<language id="7">
<name>Python</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="3" />
<intendedUse id="9" />
<intendedUse id="10" />
<intendedUse id="11" />
<intendedUse id="12" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="3" />
<feature id="6" />
</features>
<standards>
<standard id="5" />
</standards>
</language>
<language id="8">
<name>Basic</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="13" />
</purpose>
<features>
<feature id="1" />
<feature id="4" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
</standards>
</language>
<language id="9">
<name>ADA</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="2" />
<intendedUse id="14" />
<intendedUse id="15" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="4" />
<feature id="5" />
</features>
<standards>
<standard id="1" />
<standard id="2" />
<standard id="6" />
</standards>
</language>
<language id="10">
<name>ActionScript 3.0</name>
<purpose>
<intendedUse id="1" />
<intendedUse id="7" />
<intendedUse id="9" />
</purpose>
<features>
<feature id="1" />
<feature id="2" />
<feature id="7" />
</features>
<standards>
<standard id="3" />
</standards>
</language>
</languages>
<purpose>
<intendedUse id="1"> Application</intendedUse>
<intendedUse id="2"> System </intendedUse>
<intendedUse id="3"> General Purpose </intendedUse>
<intendedUse id="4"> Low-Level Operations </intendedUse>
<intendedUse id="5"> RAD </intendedUse>
<intendedUse id="6"> Business </intendedUse>
<intendedUse id="7"> Client-Side </intendedUse>
<intendedUse id="8"> Server-Side </intendedUse>
<intendedUse id="9"> Web </intendedUse>
<intendedUse id="10"> Scripting </intendedUse>
<intendedUse id="11"> AI </intendedUse>
<intendedUse id="12"> Scientific Computing </intendedUse>
<intendedUse id="13">Education</intendedUse>
<intendedUse id="14">Embedded</intendedUse>
<intendedUse id="15">RealTime</intendedUse>
</purpose>
<features>
<feature id="1">Imperative </feature>
<feature id="2">Object-Oriented</feature>
<feature id="3">Functional</feature>
<feature id="4">Procedural</feature>
<feature id="5">Generic</feature>
<feature id="6">Reflective</feature>
<feature id="7">Event-Driven</feature>
</features>
<standards>
<standard id="1">ANSI</standard>
<standard id="2">ISO</standard>
<standard id="3">ECMA</standard>
<standard id="4">DE FACTO</standard>
<standard id="5">NO</standard>
<standard id="6">GOST</standard>
</standards>
</programming>
这是打印出来的
=======编程语言1=======
语言:C
预期用途:应用程序应用程序应用程序 至关重要的 命令式
=======编程语言2=======
语言:C++
预期用途:应用程序
势在必行 至关重要的 至关重要的 至关重要的 势在必行
第一件事:
<xsl:for-each select="/programming/purpose/intendedUse[@id=$intendedUseID]" >
将您置于 intendedUse
的背景下。从这个上下文中,您只需要通过执行以下操作来获取当前节点的值:
<xsl:value-of select="." />
你的方式:
<xsl:value-of select="/programming/purpose/intendedUse" />
返回根并选择此路径上的第一个节点。
第二件事是,当您的第一个也是唯一一个模板在输入树的中间开始时,更高层的节点及其后代将由 built-in template rules 处理。
结果,您将在结果中积累大量垃圾文本,因为默认情况下,所有文本节点都被复制到输出树。你应该让你的第一个模板匹配根节点:
<xsl:template match="/">
并更改包含的路径以从那里开始。
最后,您应该考虑使用 keys 从文档的其他分支查找数据:它也更整洁、更高效。