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 美元。
我有以下 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 美元。