查找文本字符串中的字符数,最多为某个字符

时间:2016-02-03 16:10:07

标签: xml xslt xslt-1.0

我的XML文档中有一些注释。每个注释都遵循以下规则:

NOTE1
NOTE1<div>NOTE2</div>
<div>NOTE2</div>

在我的XML中,我有:

<MeetingWorkBook>
   <Labels>
      <Note>Note</Note>
   </Labels>
   <Meeting>
      <Note>Note1</Note>
   </Meeting>
   <Meeting>
      <Note>Note1&lt;div&gt;Note2&lt;/div&gt;</Note>
   </Meeting>
   <Meeting>
      <Note>&lt;div&gt;Note2&lt;/div&gt;</Note>
   </Meeting>
</MeetingWorkBook>

在XSL文件中我有:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" version="4.01"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
        doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
                <link rel="stylesheet" type="text/css" href="Workbook-off.css"/>
                <title>Title</title>
            </head>
            <body>
                <xsl:for-each select="MeetingWorkBook/Meeting">
                    <table>
                        <xsl:if test="normalize-space(Note) != ''">
                            <tr>
                                <td class="borderDotMeetingNotes" colspan="4">
                                    <xsl-if test="normalize-space(substring-before(Note, '&lt;div&gt;') != '')">
                                        <xsl:value-of select="//Labels/Note"/>:&#160;
                                    </xsl-if>
                                    <xsl:value-of select="Note" disable-output-escaping="yes"/>
                                </td>
                            </tr>
                        </xsl:if>
                    </table>            
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

我想要实现的目标是什么?在最终输出中,如果有NOTE1,那么我想显示“Note:”标签前缀。就是这样。

第三个示例失败,因为没有NOTE1。这比实际更难以解释。 :(

我试过了:

<xsl:if test="normalize-space(Note) != ''">
    <tr>
        <td class="borderDotMeetingNotes" colspan="4">
           <xsl-if test="normalize-space(substring-before(Note, '&lt;div&gt;') != '')">
                <xsl:value-of select="//Labels/Note"/>:&#160;
           </xsl-if>
           <xsl:value-of select="Note" disable-output-escaping="yes"/>
        </td>
    </tr>
</xsl:if>   

但“注意:”仍然出现。

2 个答案:

答案 0 :(得分:1)

如果我理解正确(完全不确定)你想进行测试:

<xsl:if test="substring-before(Note, '&lt;div&gt;')">
    <xsl:value-of select="//Labels/Note"/>:&#160;
</xsl:if>

注意:您需要使用<xsl:if>,而不是<xsl-if>

答案 1 :(得分:0)

感谢已提供的答案和随后的评论。

似乎使用 normalize-space 仍然让事情变得混乱,最后我做了这个似乎完全可以运作的事情:

<xsl:if test="normalize-space(Note) != ''">
    <tr>
        <td class="borderDotMeetingNotes" colspan="4">
            <xsl:if test="normalize-space(substring-before(Note, '&lt;div')) or not(contains(Note, '&lt;div'))">
                <xsl:value-of select="//Labels/Note"/>:&#160;
            </xsl:if>
            <xsl:value-of select="Note" disable-output-escaping="yes"/>
        </td>
    </tr>
</xsl:if>

请注意,最后我还搜索了&lt; div ,因为用户实际上有一个与div关联的