【发布时间】:2014-03-18 21:49:36
【问题描述】:
当我要格式化的节点丢失时,我无法应用模板。我不认为这种解释具有很强的描述性,因此我提供了一个模拟示例来准确说明我的意思。我有以下形式的 XML:
<mains>
<main>
<detail1>stuff11</detail1>
<detail2>stuff12</detail2>
</main>
<main>
<detail1>stuff22</detail1>
</main>
<main>
<detail2>stuff32</detail2>
<detail3>stuff33</detail3>
</main>
</mains>
目前,我使用的 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>
当我应用 XSL 时,我得到以下信息
<?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>
这不是我想要的那张桌子。我想要下表
<?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>
为了争论,假设我不能将 <tr><td></td></tr> 标记移到各种详细信息模板之外,它们必须保留在那里。
我知道我可以在每个模板调用上执行 <xsl:if> 并检查 value-of 以确保它存在或不存在,但这感觉很笨拙。是否有设置使apply-templates 即使在节点丢失时也适用?
【问题讨论】:
-
你确定这是你想要的结果吗?还是您的意思是每个主要的一行,每行有 3 个单元格?
-
是的,我确定。这是一个例子,它不是我想要的行和列,我正在应用的模板有更多。我只想在缺少的节点上应用模板。或者可以让我获得那种效果而又不会太笨重的东西。 (最佳做法是理想的)
-
"我只想在缺少的节点上应用模板。" 正如您发现的那样,这不会产生任何结果 - 所以您需要重新考虑这个语句:“为了争论,假设我不能将
标签移到各种详细信息模板之外,它们必须留在那里。”。顺便说一句,根据我的经验,一个人为的例子并不能带来好的答案。 -
相信你明白我想要的效果。我正在应用的模板很复杂,与我面临的问题没有任何关系。根据我的经验,一个简单的问题可以找到一个好的答案,假设答案不是“那么你为什么要首先这样做?”
-
你的例子的问题在于它导致了既定的思维模式(“哦,他想要一张桌子,我知道如何制作一张桌子”)。无论如何,您的要求中的 something 必须给予,因为不可能同时满足两者,恕我直言。
标签: xml xslt xml-parsing