Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 缺少节点时XSL应用模板_Xml_Xslt_Xml Parsing - Fatal编程技术网

Xml 缺少节点时XSL应用模板

Xml 缺少节点时XSL应用模板,xml,xslt,xml-parsing,Xml,Xslt,Xml Parsing,当我要格式化的节点丢失时,我在应用模板时遇到问题。我不相信这个解释是很有描述性的,所以我加入了一个模拟的例子来说明我的意思。我有以下形式的XML: <mains> <main> <detail1>stuff11</detail1> <detail2>stuff12</detail2> </main> <main> <deta

当我要格式化的节点丢失时,我在应用模板时遇到问题。我不相信这个解释是很有描述性的,所以我加入了一个模拟的例子来说明我的意思。我有以下形式的XML:

<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