需要帮助选择带有 xsl:choose 和 xsl/when 的 XSLT

Posted

技术标签:

【中文标题】需要帮助选择带有 xsl:choose 和 xsl/when 的 XSLT【英文标题】:Need help selecting XSLT with xsl:choose and xsl/when 【发布时间】:2020-10-27 01:12:45 【问题描述】:

我的 XSLT 语言不好 - 所以任何帮助将不胜感激!我正在尝试从下面的 XML 文件 (file.xml) 中选择描述数量少于 100 个单词的评论,并且如果缺少描述,则根本不要选择它(您会注意到第二项在缺少描述的xml中)

我已经搞砸了 xsl:choosexsl/when 但似乎仍然无法让它正常工作。

使用 PHP 加载 XML 文件

$xmlFile = 'file.xml';
                   
$doc = new DOMDocument();
$xsl = new XSLTProcessor();
                    
$doc->load($xslFile);
$xsl->importStyleSheet($doc);
                    
$doc->load($xmlFile);
echo $xsl->transformToXML($doc);

这是我的 XML (file.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title>Reviews</title>
        <description>5 Star Reviews</description>
        <link></link>
        <item>
            <title>Google review 4 stars - John</title>
            <description>Lorem ipsum dolor sit amet, dico quaestio eu vis. Errem disputationi mel te, in civibus minimum qualisque vel. </description>
        </item>
        <item>
            <title>Google review 5 stars - Sarah</title>
            <description></description>
        </item>
        <item>
            <title>Google review 5 stars - Jenny</title>
            <description>I love this place! Lorem ipsum dolor sit amet, dico quaestio eu vis. Errem disputationi mel te, in civibus minimum qualisque vel. Et duo quando detracto tacimates, mediocrem instructior id pro. Nec id omnis aperiri iracundia,</description>
        </item>
    </channel>
</rss>

XSLT 文件

<?xml version="1.0" encoding="utf-8"?>

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

<xsl:template match="/rss/channel">
    <xsl:for-each select="item">
    
    <li>
        <p class="heading">
            <xsl:value-of select="title"/>
        </p>

        <p class="text">
            <xsl:value-of select="description"/>
        </p>
    </li>
    
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我的最终输出应该是这样的。

Google 评论 4 星 - 约翰 Lorem ipsum dolor sit amet,dico quaestio eu vis。 Errem disputationi mel te, in civibus minimum qualisque vel.

Google 评论 5 星 - 珍妮 我喜欢这个地方! Lorem ipsum dolor sit amet,dico quaestio eu vis。 Errem disputationi mel te,在 civibus 最低 qualisque vel 中。 Et duo quando detracto tacimates,平庸的讲师 id pro。 Nec id omnis aperiri iracundia,

【问题讨论】:

【参考方案1】:

我建议从item 选择的谓词开始,例如item[description[normalize-space()]] 仅选择具有description 子元素的item 元素,该子元素具有多个空格内容。

至于计算单词,这在 XPath 1.0 中更难表达。正如您似乎从 php 做的那样,检查 PHP 是否公开了 libxslt 的 EXSLT 扩展函数,或者调用 PHP 并计算描述内容中的单词。

要将 PHP 的 str_word_count 函数与 XSLTProcessor 一起使用,您可以使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:php="http://php.net/xsl"
    exclude-result-prefixes="php"
    version="1.0">
    
    <xsl:output method="html" encoding="utf-8" indent="yes"/>
    
    <xsl:template match="/rss/channel">
        <xsl:for-each select="item[description[normalize-space() and php:function('str_word_count', string()) &lt; 100]]">
            
            <li>
                <p class="heading">
                    <xsl:value-of select="title"/>
                </p>
                
                <p class="text">
                    <xsl:value-of select="description"/>
                </p>
            </li>
            
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>

在你需要的 PHP 代码中

$xsltProcessor = new XSLTProcessor();

$xsltProcessor->registerPHPFunctions();

我还认为您最好创建两个不同的 DOMDocument 对象,一个用于 XML 输入,一个用于 XSLT 文档。

【讨论】:

您不能将正则表达式与 EXSLT str:split() 一起使用。表达式str:split(., '\W+')" 查找文字字符串"\W+"。 ——我不认为100字的限制需要按字面意思理解;计算空间应该是足够的,恕我直言。这可以在没有扩展的情况下完成。 @michael.hor257k,好的,很抱歉,对参数的“模式”描述让我假设我可以输入正则表达式模式。将编辑以使用 PHP 函数。 @MartinHonnen 完美!非常感谢!非常感谢您的帮助:)

以上是关于需要帮助选择带有 xsl:choose 和 xsl/when 的 XSLT的主要内容,如果未能解决你的问题,请参考以下文章

XSL 选择样式文本和 td

XSL/FO 在选择语句中跳过一个值

跳过空XML节点

跳过空XML节点v.2

jmeter+maven+jenkins报告优化:添加90% line和QPS

在 XSLT 中检查字符串是不是为空或空