Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT2.0修剪最终HTML输出的文本长度_Xslt_Xslt 2.0 - Fatal编程技术网

XSLT2.0修剪最终HTML输出的文本长度

XSLT2.0修剪最终HTML输出的文本长度,xslt,xslt-2.0,Xslt,Xslt 2.0,XSLT小提琴在这里: 在XSL 2.0中,我从eXist db Lucene搜索函数接收到一小部分节点,该函数返回原始XML,但将搜索项包装在中。因此,我在tei:seg上搜索,得到了以下信息(我将其包装在一个额外的元素中,以满足以后的处理需求): http://localhost:8081/exist/apps/deheresi/doc/MS609-0454 项目。迪克西库德 阿巴斯·德 桑克托丘疹 ceperat 异端二人组 阿纳尔多·德·萨瓦扎·沃勒巴(Arnaldus de Sava

XSLT小提琴在这里:

在XSL 2.0中,我从eXist db Lucene搜索函数接收到一小部分节点,该函数返回原始XML,但将搜索项包装在
中。因此,我在
tei:seg
上搜索,得到了以下信息(我将其包装在一个额外的元素中,以满足以后的处理需求):


http://localhost:8081/exist/apps/deheresi/doc/MS609-0454
项目。迪克西库德
阿巴斯·德
桑克托丘疹
ceperat
异端二人组
阿纳尔多·德·萨瓦扎·沃勒巴(Arnaldus de Savauza volebat manulevare dictos hereticos)。罗格维特酒店
同侧睾丸
阿诺杜姆福尼尔等
雷蒙杜姆·福尼尔,弗拉特雷斯,
质量与行政
圣克托帕普洛修道院酒店
这就是异端。口述
萨瓦萨阿纳尔德斯酒店
我不同意阿巴斯的意见,因为我的意见是正确的
异教徒支持千年索里达索罗萨尼。Et
阿尔泽斯等人
伊萨努斯·德·吉贝尔·波塔班特·伊洛斯·德纳里奥斯。
这是一个非官方的宣言。
我们需要大约一年的时间。
在XSLT中,我通过一些转换将其输出到HTML中。但是,输出如下所示:

<td>Item. Dixit quod 
   abbas de 
   Sancto Papulo
   ceperat 
   duos hereticos et 
   Arnaldus de Savauza volebat manulevare dictos hereticos. Et rogavit 
   ipsum testim et 
   Arnaldum Fornier et 
   Raimundum Fornier, fratres,  
   quod irent cum eo 
   ad abbatem de Sancto Papulo 
   et manulevarent hereticos. Et dictus 
   Arnaldus de Savauza 
   dixit quod dictus abbas promiserat ei quod redderet sibi dictos 
   hereticos pro mille <span class="search-hit">
   <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0454"> 
   solidis</a></span> tholosanis. Et 
   Bernardus Alzeus et 
   Ysarnus de Gibel portabant illos denarios. 
   Sed non potuerunt dictos hereticos manulevare. 
   Et sunt anni VIIIor vel circa.
</td>
项目。迪克西特区
阿巴斯·德
桑克托丘疹
ceperat
异端二人组
阿纳尔多·德·萨瓦扎·沃勒巴(Arnaldus de Savauza volebat manulevare dictos hereticos)。罗格维特酒店
同侧睾丸
阿诺杜姆福尼尔等
雷蒙杜姆·福尼尔,弗拉特雷斯,
质量与行政
阿伯特姆德桑克托帕普洛酒店
这就是异端。口述
萨瓦萨阿纳尔德斯酒店
我不同意阿巴斯的意见,因为我的意见是正确的
异教徒
托洛萨尼斯。Et
阿尔泽斯等人
伊萨努斯·德·吉贝尔·波塔班特·伊洛斯·德纳里奥斯。
这是一个非官方的宣言。
我们需要大约一年的时间。
但我希望最终输出用省略号缩短:

<td>...dictus abbas 
  promiserat ei quod redderet sibi dictos 
  hereticos pro mille <span class="search-hit"><a 
  href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0454"> 
  solidis</a></span> tholosanis. Et 
  Bernardus Alzeus et 
  Ysarnus de Gibel portabant illos...
</td>
…阿巴斯名言
信誓旦旦
异端邪说者。Et
阿尔泽斯等人
伊萨努斯吉贝尔酒店。。。
其中
内容两侧的文本输出限制为
x
字符数。(此外,如果可能,请应用
normalize-space()
,以解决原始文档中的字符间距问题。)

我还没有发现如何在当前XSL转换中实现这一点的任何想法,只是在后处理中


非常感谢。

您可以将从现有代码中获得的
tei:seg
结果的内容分别存储在

<xsl:template match="tei:seg">
    <xsl:variable name="search-hit">
        <xsl:apply-templates/>
    </xsl:variable>
    <td>
        <xsl:apply-templates select="$search-hit" mode="trim"/>
    </td>
</xsl:template>

然后,您可以通过另一种模式推送该内容,该模式具有用于文本节点进行修剪的模板:

<xsl:param name="trim-to" as="xs:integer" select="60"/>

<xsl:template match="text()[1]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat('...', substring($normalized, string-length($normalized) - $trim-to))"/>
</xsl:template>

<xsl:template match="text()[last()]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat(substring($normalized, 1, $trim-to), '...')"/>
</xsl:template>

<xsl:template match="span[@class = 'search-hit']" mode="trim">
    <xsl:copy-of select="."/>
</xsl:template>

可以使用文本节点模板中的
replace
和/或
tokenize
和/或
xsl:analyze string
对进行修剪/规范化的代码进行微调,但这仅在修剪所需的算法明确时才可能


Fiddle在进行调整。

因为XML的结果文本包含许多不同的元素,而当前的结果是通过将XML推过几个模板生成的,我不知道如何修复原始XSLT,除了将当前结果存储在变量中并通过不同的模式运行它,然后根据需要进行规范化和修剪。我不确定这是否已经是您所做的后处理类型。至于修剪算法,每个
td
中是否有一个
span class=“搜索命中”
?是的,只有一个
span class=“搜索命中”
每个输出
td
。我还想补充一点,在
td
中永远不会有任何其他元素-这是搜索结果的最终目标输出结构。我尝试将原始方法的结果存储在模板匹配的变量中
tei:seg
,然后,您可以将其推入不同的模式,并对两个文本节点进行任何规格化和修剪。那里的结果看起来并不漂亮,但我想如果您知道要修剪或删除空白的算法,在文本节点的两个模板中使用
replace
和/或
xsl:analyze string
对其进行微调应该很容易。在
seg
模板中指定变量是一个非常有趣的问题解决方案,谢谢。如果您想将此作为答案发布,我会接受。在部署此功能时,我意识到
可能出现在
td
的开头或结尾,因此模板
text()[1]
text()[last()]
将是相同的-这将导致
规则匹配不明确。有没有办法使这些模板相对于跨度前后的文本节点而不是绝对位置?我尝试使用下面/前面的同级,但似乎找不到正确的XPath公式来命中文本节点……您可以尝试
match=“text()[后面的同级::node()[1][self::span[@class='search hit']]]]“
用于
text()[1]
match=“text()[前面的同级::node()[1][self span[@class='search hit']]””
用于
文本()[last()]
。如果只创建了特定的
span
,则不确定是否需要
span
上的谓词,但使用
following sibling::node()[1][self::foo]
进行检查是表示存在即时
foo
同级的常用方法。
<xsl:param name="trim-to" as="xs:integer" select="60"/>

<xsl:template match="text()[1]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat('...', substring($normalized, string-length($normalized) - $trim-to))"/>
</xsl:template>

<xsl:template match="text()[last()]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat(substring($normalized, 1, $trim-to), '...')"/>
</xsl:template>

<xsl:template match="span[@class = 'search-hit']" mode="trim">
    <xsl:copy-of select="."/>
</xsl:template>