gpt4 book ai didi

xml - 如何为一个节点使用两个不同的分析字符串

转载 作者:数据小太阳 更新时间:2023-10-29 02:19:36 24 4
gpt4 key购买 nike

在我的 XSLT 转换中,我需要使用两个分析字符串来处理一个节点。它们一个接一个地工作得很好,但我不知道如何将它们组合在一起。

XML 文档如下所示:

<article>
<title>Article 1</title>
<text><![CDATA[Lorem ipsum dolor sit amet, s consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit.

Sed sit amet erat ac mauris adipiscing elementum. Pellentesque eget quam augue, id faucibus magna.

Ut malesuada arcu eu elit sodales sodales. Morbi tristique porttitor tristique. Praesent eget vulputate dui. Cras ut tortor massa, at faucibus ligula.]]></text>
</article>

这是我的 XSLT:

<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Page title</title>
</head>
<body>
<xsl:for-each select="article">
<h1><xsl:value-of select="./title"/></h1>

<!-- This adds paragraphs tags instead of empty lines in the text -->
<xsl:analyze-string select="./text" regex="&#xa;">
<xsl:non-matching-substring>
<p>
<xsl:value-of select="." disable-output-escaping="yes"/>
</p>
</xsl:non-matching-substring>
</xsl:analyze-string>

<!-- This is Czech language specific. It looks for ' s ' (or other letter) and changes second space for &nbsp;. So after that it is ' s&nbsp;'. -->
<xsl:analyze-string select="./text" regex="(\s[k/K/s/S/v/V/z/Z]\s)">
<xsl:matching-substring>
<xsl:text> </xsl:text>
<xsl:value-of select="replace(., ' ','')" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:for-each>
</body>
</html>
</xsl:template>

我需要对生成的文本应用两个分析字符串,所以有 <p>段落标签,还添加了 &nbsp;在正确的地方。

我想要的输出是这样的:

<h1>Article 1</h1>    
<p>Lorem ipsum dolor sit amet, s&nbsp;consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit.</p>
<p>Sed sit amet erat ac mauris adipiscing elementum. Pellentesque eget quam augue, id faucibus magna.</p>
<p>Ut malesuada arcu eu elit sodales sodales. Morbi tristique porttitor tristique. Praesent eget vulputate dui. Cras ut tortor massa, at faucibus ligula.</p>

知道怎么做吗?感谢您花时间帮助我。

最佳答案

这是我对 Dimitre 解决方案的调整:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="UTF-8"/>

<xsl:template match="/*/text">
<xsl:for-each select="tokenize( replace(., '\s([kKsSvVzZ])\s', ' $1&#xA0;'), '\n')">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
</xsl:template>

<xsl:template match="title">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
</xsl:stylesheet>

注意事项

  1. 我不确定“字母 s/S/v/V/k/K/z/Z”是什么意思。这不是有效的正则表达式。你需要澄清。我猜你指的是字符类 [sSvVkKzZ]
  2. 虽然不清楚,但对捷克语的引用表明 UTF-8 可能是比 ASCII 更好的输出编码选择。
  3. 虽然不清楚,但预期的输出标签,建议更合适的序列化将是 html。
  4. 作为选择 html 序列化的附带好处,我们不再需要字符映射,从而使我们的解决方案更简单。我们可以利用内置字符映射进行 html 序列化。
  5. 使用 fn:tokenise() 避免了对 xsl:analyze-string/xsl:non-matching-substring 节点的需要,可以说会导致更紧密的解决方案。
  6. 此解决方案已通过 Saxon 测试。
  7. 变化是可能的。例如,您可以将 replace() 调用移动到 xsl:value-of 内部,您可能认为它更具可读性。
  8. 我的解决方案的缺点是它不适用于 disable-output-escaping="yes"。但是我建议,如果你认为你需要这个,请再次仔细看看为什么。任何 HTML 都需要 HTML 安全编码,除非它位于 CDATA 部分内。在启用禁用输出转义的情况下生成 HTML 的想法有些不对。也许我还没有完全理解这个问题。你能给出一个用例来阐明这一点吗?

关于xml - 如何为一个节点使用两个不同的分析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com