【发布时间】:2017-12-07 17:18:34
【问题描述】:
输入
<items>
<item>Lorem ipsum dolor sit amet, sed diam nonumy tempor magna aliquyam erat. Ssed diam voluptua.</item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy<br/>tempor magna aliquyam erat. Ssed diam voluptua.</item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy <b>tempor magna aliquyam erat</b>. Ssed diam voluptua.</item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy <b>tempor <i>magna</i> aliquyam erat</b>. Ssed diam voluptua.</item>
<item>Lorem ipsum dolor sit amet.</item>
</items>
要求
- “剪切”在特定长度后最接近的单词,例如25 个字符(包括空格)
- 所有
nodes()之前该位置都保持不变 - 所有
*在该位置后获得属性foo="bar" - 所有
text()在该位置之后都由template with mode='xy'处理(此模板将丑化文本);该模板将所有相邻的text()-nodes 包装在<o foo="bar">+ 中,并将其本身作为'#' - 如果
text()-nodes 在部分可读/丑化*中,这些text()-nodes 被包裹在一个新元素<o foo="bar">[参见 item[4] => "aliquyam erat"] + 本身作为'#' - IF
string-length(text()) le $visibleCharsTHEN 没有任何反应
输出
<!-- middle of word "temppor" -->
<xsl:variable name="visibleChars" select="number(48)"/>
<items>
<item>Lorem ipsum dolor sit amet, sed diam nonumy tempor<o foo="bar"> #</o></item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy<br/>tempor<o foo="bar"> #</o></item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy <b>tempor<o foo="bar">#</o></b><o foo="bar">#</o></item>
<item>Lorem ipsum dolor sit amet, sed diam nonumy <b>tempor <i foo="bar">#</i><o foo="bar"> #</o></b><o foo="bar">#</o></item>
<item>Lorem ipsum dolor sit amet.</item>
</items>
伪 xslt 失败
<xsl:templates match="item">
WHEN count(text()) eq count(node())
THEN
Create a $temp of <item> AND insert a <cut/> at position ($visibleChars + CharsTillNextDelimiter)
<!-- chars to stay visible -->
<xsl:apply-templates select="$temp/text()[following-sibling::cut]"/>
<!-- chars to uglify -->
<xsl:apply-templates select="$temp/text()[preceding-sibling::cut]" mode="xy"/>
WHEN (*)
THEN
NoIDEAToTackleMixedContentFields
...
<xsl:template match="text()" mode="xy">
<xsl:analyze-string select="." regex="[a-zA-Z0-9]">
<xsl:matching-substring>
<xsl:text>#</xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
...
我没有正在运行的缩小版 xslt,但有人可能会向我展示满足要求的方法。感谢您提供任何帮助,我希望我在示例中涵盖了所有可能的情况。
【问题讨论】:
标签: xml xslt xslt-1.0 xslt-2.0