Xml 缺少节点时XSL应用模板
当我要格式化的节点丢失时,我在应用模板时遇到问题。我不相信这个解释是很有描述性的,所以我加入了一个模拟的例子来说明我的意思。我有以下形式的XML:Xml 缺少节点时XSL应用模板,xml,xslt,xml-parsing,Xml,Xslt,Xml Parsing,当我要格式化的节点丢失时,我在应用模板时遇到问题。我不相信这个解释是很有描述性的,所以我加入了一个模拟的例子来说明我的意思。我有以下形式的XML: <mains> <main> <detail1>stuff11</detail1> <detail2>stuff12</detail2> </main> <main> <deta
<mains>
<main>
<detail1>stuff11</detail1>
<detail2>stuff12</detail2>
</main>
<main>
<detail1>stuff22</detail1>
</main>
<main>
<detail2>stuff32</detail2>
<detail3>stuff33</detail3>
</main>
</mains>
填充物11
物品12
填充物22
填充物32
填充物33
目前,我使用的XSL执行以下操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/mains">
<table>
<xsl:apply-templates select="main"/>
</table>
</xsl:template>
<xsl:template match="main">
<xsl:apply-templates select="detail1"/>
<xsl:apply-templates select="detail2"/>
<xsl:apply-templates select="detail3"/>
</xsl:template>
<xsl:template match="detail1">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="detail2">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="detail3">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr><td>stuff11</td></tr>
<tr><td>stuff12</td></tr>
<tr><td>stuff21</td></tr>
<tr><td>stuff32</td></tr>
<tr><td>stuff33</td></tr>
</table>
当我应用XSL时,我得到以下结果
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/mains">
<table>
<xsl:apply-templates select="main"/>
</table>
</xsl:template>
<xsl:template match="main">
<xsl:apply-templates select="detail1"/>
<xsl:apply-templates select="detail2"/>
<xsl:apply-templates select="detail3"/>
</xsl:template>
<xsl:template match="detail1">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="detail2">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="detail3">
<tr>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr><td>stuff11</td></tr>
<tr><td>stuff12</td></tr>
<tr><td>stuff21</td></tr>
<tr><td>stuff32</td></tr>
<tr><td>stuff33</td></tr>
</table>
填充物11
物品12
填充物21
填充物32
填充物33
这张桌子不是我想要的。我想要下表
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr><td>stuff11</td></tr>
<tr><td>stuff12</td></tr>
<tr><td></td></tr>
<tr><td>stuff21</td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td>stuff32</td></tr>
<tr><td>stuff33</td></tr>
</table>
填充物11
物品12
填充物21
填充物32
填充物33
为了便于讨论,我不能将
标记移到各种详细信息模板之外,它们必须留在那里
我知道我可以对每个模板调用执行
,并检查的值以确保它是否存在,但这感觉非常笨拙。是否有设置使应用模板
即使在节点丢失时也应用?很抱歉,将模板应用到空集会产生空结果
通过向上重构HTML包装,您可能可以得到所需的内容——在调用模板中生成
包装,并让“detail”模板只生成数据内容
或者,可能只有一个
,但对其应用
,以按所需顺序(1、2、3)生成结果。抱歉,但将模板应用于空集确实会生成空结果
通过向上重构HTML包装,您可能可以得到所需的内容——在调用模板中生成
包装,并让“detail”模板只生成数据内容
或者,也许只需要一个
,但对其应用
,以按所需顺序(1、2、3)生成结果。谈论“不存在的节点”是一厢情愿的想法。没有这样的节点,因此您无法选择它,因此您无法处理它。您需要xsl:choose。谈论“不存在的节点”是一厢情愿的想法。没有这样的节点,因此您无法选择它,因此您无法处理它。您需要一个xsl:choose。找到了一个解决方法
<xsl:apply-templates select=".">
<xsl:with-param name="value" select="detail1" />
</xsl:apply-templates>
这将使模板始终被调用,并且我可以在模板中使用xsl:choose
处理缺少的节点,而不是在每个模板调用周围包装xsl:choose
话虽如此,我不确定什么是“最佳实践”,所以如果有人有更好的解决方案,我还是很想听听。想出了一个解决办法
<xsl:apply-templates select=".">
<xsl:with-param name="value" select="detail1" />
</xsl:apply-templates>
这将使模板始终被调用,并且我可以在模板中使用xsl:choose
处理缺少的节点,而不是在每个模板调用周围包装xsl:choose
话虽如此,我不确定什么是“最佳实践”,因此,如果有人有更好的解决方案,我仍然有兴趣听到它。你确定这就是你想要的结果吗?或者你的意思是每一条主线有一行,每行有3个单元格?是的,我肯定。这是一个例子,我想要的不是行和列,我正在应用的模板对它们有更多的影响。我只想在缺少的节点上应用模板。或者是什么能让我不至于太笨重而达到那种效果的东西。(最佳实践是理想的)“我只想在缺少的节点上应用模板。”正如您所发现的,这不会产生任何结果-因此您需要重新考虑这句话:“为了参数起见,请说我不能将标记移到各种细节模板之外,它们必须留在那里。”。顺便说一句,根据我的经验,一个做作的例子并不能带来好的答案。我相信你确实理解我想要的效果。我正在应用的模板很复杂,与我面临的问题没有任何关系。根据我的经验,一个简单的问题能够找到问题的根源,并给出一个很好的答案,假设答案不是“你为什么要这么做?”你的例子的问题是它导致了既定的思维模式(“哦,他想要一个表,我知道如何生成表”)。不管怎样,你的要求中有一些东西必须给出,因为不可能同时满足这两个要求,IMHO。你确定这就是你想要的结果吗?或者你的意思是每一条主线有一行,每行有3个单元格?是的,我肯定。这是一个例子,我想要的不是行和列,我正在应用的模板对它们有更多的影响。我只想在缺少的节点上应用模板。或者是什么能让我不至于太笨重而达到那种效果的东西。(最佳实践是理想的)“我只想在缺少的节点上应用模板。”正如您所发现的,这不会产生任何结果-因此您需要重新考虑这句话:“为了参数起见,请说我不能将标记移到各种细节模板之外,它们必须留在那里。”。顺便说一句,根据我的经验,一个做作的例子并不能带来好的答案。我相信你确实理解我想要的效果。我正在应用的模板很复杂,与我面临的问题没有任何关系。根据我的经验,一个简单的问题能够找到问题的根源,并给出一个很好的答案,假设答案不是“你为什么要这么做?”你的例子的问题是它导致了既定的思维模式(“哦,他想要一个表,我知道如何生成表”)。不管怎样,你的需求中有一些东西必须给出,因为不可能同时满足这两种需求,嗯,这有点像cur