XSLT - 如何指定点文本将在新行上继续的位置

XSLT - How to specify where dot point text will continue on new line

我有以下 XML 元素被 XSLT 转换为 HTML。我的 XSLT 处理器是 Microsoft 1。

当我调用 XML 中的元素以显示在 XSLT 中的 <li></li> 标记中时,我希望能够指定单个 <li></li> 文本内容将在何处继续一旦到达某个点,就会出现一条新线。

我尝试将 <br></br> 添加到我希望在我的 XML 元素中出现中断的位置,但它只会导致新行旁边有一个项目符号点,我没有想。

最好的方法是什么?

这是我的代码示例:

XML ELEMENT 被调入 <li></li>. 在此示例中,将创建两个 <li></li>,因为我的 XSLT 通过 ; 将元素拆分为不同的点。作为分隔符。

<research>Strategies and Approaches to Teaching and Learning Cross Cultures,  Office for Learning and Teaching,  
    LOL - Grant (pre-2013),  2008 - 2052, ,000;  Parkour strategies and parallel jumps for spatial data monitoring and join processing,  
    Right Wing Politics,  JSA Early Career Artifact - Grant,  2004 - 20010,  ,0000.
    </research>

浏览器似乎以不同的方式对待 <br></br><br/>,尽管我从未见过有人添加新的要点。我认为 <br/> 可以满足您的需求。

如果您可以并且想要在源 XML 文档中手动插入换行符,我建议您为此使用一些特殊的 string,而不是 标记元素 例如<br/>。然后您可以调用另一个递归模板,用真正的 HTML 换行符替换特殊字符串的任何实例。

例如,使用 § 符号表示以下输入中请求的换行符 XML:

<research>Strategies and Approaches to Teaching and Learning Cross Cultures,  Office for Learning and Teaching,  
LOL - Grant (pre-2013),  2008 - 2052, §,000;  Parkour strategies and parallel jumps for spatial data monitoring and join processing,  
Right Wing Politics,  JSA Early Career Artifact - Grant,  2004 - 20010,  ,0000.
</research>

然后,在您的 XSLT 调用之后:

<ul>
    <xsl:call-template name="tokenize">
        <xsl:with-param name="text" select="research"/>
    </xsl:call-template>
</ul>

您需要将标记化模板从 修改为:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="';'"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <li>
                <xsl:call-template name="replace">
                    <xsl:with-param name="text" select="$token"/>
                </xsl:call-template>
            </li>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

并添加替换模板:

<xsl:template name="replace">
    <xsl:param name="text"/>
    <xsl:param name="search-string" select="'§'"/>
    <xsl:choose>
        <xsl:when test="contains($text, $search-string)">
            <xsl:value-of select="substring-before($text, $search-string)"/>
            <br/>
            <xsl:call-template name="replace">
                <xsl:with-param name="text" select="substring-after($text, $search-string)"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

这是一个不使用任何 <xsl:choose><xsl:when><xsl:otherwise> 的简短解决方案:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
    <ul>
      <xsl:apply-templates select="research"/>
    </ul>
 </xsl:template>

 <xsl:template match="research/text()[normalize-space()]" name="split">
     <xsl:param name="pText" select="."/>
     <xsl:if test="normalize-space($pText)">
       <li>
         <xsl:call-template name="replace">
           <xsl:with-param name="pText" select="substring-before(concat($pText, ';'), ';')"/>
         </xsl:call-template>
       </li>
       <xsl:call-template name="split">
         <xsl:with-param name="pText" select="substring-after($pText, ';')"/>
       </xsl:call-template>
     </xsl:if>
 </xsl:template>

 <xsl:template name="replace">
   <xsl:param name="pText"/>
   <xsl:if test="normalize-space($pText)">
       <xsl:value-of select="substring-before(concat($pText, '§'),'§')"/>
       <xsl:if test="contains($pText, '§')">
           <br/>
         <xsl:call-template name="replace">
           <xsl:with-param name="pText" select="substring-after($pText, '§')"/>
         </xsl:call-template>
       </xsl:if>
    </xsl:if> 
 </xsl:template>
</xsl:stylesheet>

当此转换应用于此源时 XML 文档(最初提供的带有插入“;”的行项目和“§”换行符) :

<research>Strategies and Approaches to Teaching and Learning Cross Cultures,  Office for Learning and Teaching,  
LOL - Grant (pre-2013),  2008 - 2052, §,000;  Parkour strategies and parallel jumps for spatial data monitoring and join processing,  
Right Wing Politics,  JSA Early Career Artifact - Grant,  2004 - 20010,  §,0000.
</research>

产生了想要的、正确的结果:

<ul>
  <li>Strategies and Approaches to Teaching and Learning Cross Cultures,  Office for Learning and Teaching,  
LOL - Grant (pre-2013),  2008 - 2052, <br />,000</li>
  <li>  Parkour strategies and parallel jumps for spatial data monitoring and join processing,  
Right Wing Politics,  JSA Early Career Artifact - Grant,  2004 - 20010,  <br />,0000.
</li>
</ul>

浏览器显示为:

  • 跨文化教学策略和方法,学习与教学办公室, LOL - 拨款(2013 年之前),2008 - 2052,
    90,000 美元
  • 空间数据监控和连接处理的跑酷策略和平行跳跃, 右翼政治,JSA Early Career Artifact - Grant,2004 - 20010,
    14,0000 美元。