xslt中如何匹配非字符串

How match non string in xslt

我想匹配 xslt 2.0 中的非字符串。

<td><list>
        <list-item>
            <p>aaaa</p>
            <list>
                <list-item>
                    <p>bbb</p>
                </list-item>
            </list>
        </list-item>
    </list>
</td>

我做过这样的模板

<xsl:template match="td">
    <para>
        <xsl:apply-templates/>
    </tps:p>
</xsl:template>

当输入 xml 如下:

<td><list>
        <list-item>
            <p>aaaa</p>
            <list>
                <list-item>
                    <p>bbb</p>
                </list-item>
            </list>
        </list-item>
    </list>
kmkmkmk
</td>

输出(正确输出):

<para>kmkmkmk</para>

当像下面这样输入 xml 时(td 和列表之间换行):

<td><list>
        <list-item>
            <p>aaaa</p>
            <list>
                <list-item>
                    <p>bbb</p>
                </list-item>
            </list>
        </list-item>
    </list>
</td>

输出(输出不正确):

<para> </para>

但是当像下面这样输入 xml 时(td 和 list 之间没有新行):

<td><list>
        <list-item>
            <p>aaaa</p>
            <list>
                <list-item>
                    <p>bbb</p>
                </list-item>
            </list>
        </list-item>
    </list></td>

输出(正确输出):

nothing display

我想在 td 没有任何文本时不显示,仅显示 td 有文本。

为什么在 <td><list> 之间有一条新线不能正常工作,哪里没有新线工作良好。我该如何解决这个问题?

您的样本不是最小且完整的,而是要转换一个 td 元素节点,您可以使用该元素节点具有非空白文本子内容

<xsl:template match="td[text()[normalize-space()]]">
  <para>
    <xsl:apply-templates/>
  </para>
</xsl:template>

是否额外需要 <xsl:template match="td[not(text()[normalize-space()])]"/><xsl:template match="td[not(text()[normalize-space()])]"><xsl:apply-templates/></xsl:template> 取决于您如何设置其余转换。