Xslt 基于动态字符串的XPATH语句求值 (有点)短而且(也许?)甜

Xslt 基于动态字符串的XPATH语句求值 (有点)短而且(也许?)甜,xslt,xpath,saxon,Xslt,Xpath,Saxon,如何将条件逻辑(与测试属性中的XPATH相同)放入通过文档('layoutsheet.XML')读取的XML表的属性中,而不使用saxon:evaluate或XSLT 3实际评估调用XSL表中的逻辑?(而且dyn:evaluate似乎也不存在) 澄清:我主要寻找的是,是否有某种模式使用逻辑的节点表示和相关转换,从而使我产生类似的行为。我不介意在XML工作表中创建一个处理布局行为的代表性结构。我现在对任何不能在XSL中编写完整的解释器的东西都是一片空白,这看起来可能是一种可怕的重复工作和浪费时间

如何将条件逻辑(与
测试属性中的XPATH相同)放入通过
文档('layoutsheet.XML')
读取的XML表的属性中,而不使用
saxon:evaluate
或XSLT 3
实际评估调用XSL表中的逻辑?(而且
dyn:evaluate
似乎也不存在)


澄清:我主要寻找的是,是否有某种模式使用逻辑的节点表示和相关转换,从而使我产生类似的行为。我不介意在XML工作表中创建一个处理布局行为的代表性结构。我现在对任何不能在XSL中编写完整的解释器的东西都是一片空白,这看起来可能是一种可怕的重复工作和浪费时间来获得较差的结果

因为我自己并没有调用XSL解析器(它是由我不维护也不能直接更改的软件调用的),所以我基本上只限于Saxon固有的功能。我主要想找到一个便携的答案,既能保障我们自己未来的安全,也能在其他地方有价值的情况下实现潜在的共享。如果这是我用手头的工具所能做到的最好的,我很乐意听你这么说


理想情况下,我希望这个逻辑完全封装在XML表中,而不是依赖于在XSL表中了解它的特定方面。也就是说,我不想假设这将始终是一个两部分的比较,使用特定的函数调用对单个元素的值进行求值(例如,将逻辑求值的两侧存储为单独的属性,然后我必须在XSL表中知道这些属性才能对彼此进行求值,这并不理想)。我也不想使匹配拾取逻辑基于特定的布局结构:其想法是使其尽可能与结构无关,而是在XML表中包含相关的结构逻辑

虽然我可以加载具有更深层结构的XML工作表以用作匹配条件(当匹配的计算结果为true时,这反过来将继续其深层身份转换结构,否则将不进行匹配),理想情况下,我仍然更喜欢灵活的条件逻辑,而不是简单的两值相等测试,例如完整XPATH语句所允许的测试


较长的解释和相关代码段 我正在一个基于XSLT的CMS中工作,并试图使用一个单独的XML表来确定文档布局,从而创建一个动态版本目标系统。到目前为止,这是一项工作,但进展顺利。长话短说,我们需要更具运行时动态性的东西,而不是简单地通过导入/包含嵌套进行重写

最初的系统依赖于命名模板调用来拉入页面的不同区域,然后通过身份转换来完成包含相关部分的工作。我基本上用一个XML布局表代替了它,该布局表使用在XSL表中匹配的命名空间模板“调用”。这是一个初始迭代,旨在尽可能快地实现,同时提供未来更大的灵活性,因此与命名调用范式保持接近

我遇到的一个问题是如何处理条件放置,而不必进行特定的匹配和相应的“调用”,并在XSL表中附加相关逻辑,而不是将该逻辑模块化到XML中

我发现了一个目前正在使用saxon:evaluate的工作解决方案,但希望得到其他解决方案(xslt2)的任何输入,这些解决方案不依赖于特定于供应商的扩展。因为这是在第三方CMS(OmniUpdate的OU校园)中,所以我自己无法加载扩展:我基本上只能使用Saxon已经加载的任何扩展

基本布局表:(使用XHTML定义文档结构的XML,然后通过XSLT从包含实际文档内容的调用XML文档表合并到文档结构中)

我觉得我可能忽略了一些东西,可能是一些显而易见的东西(也许是因为我正试图不患支气管炎,瞎说)。而撒克逊:evaluate对我来说非常简单,我更喜欢更具可移植性的东西,因为这种方法通常允许沿着MVC体系结构概念进行一些非常好的模块化,以便使用相对简单的XHTML+轻型XML布局表处理非结构化的基于XML的内容表,以处理大多数视图结构和表示,使不熟悉XSLT的人更容易修改相关结构

注: EXSLT的dyn:evaluate没有在Saxon中实现,因此这不是一个交叉兼容的选项,尽管如果它在功能上是等效的,那么我想我可以坚持使用Saxon:evaluate,并告诉人们用dyn:evaluate替换它,如果不是在Saxon上,这可能是最好的方法


实际调用XML表格式的缩略示例(我减少了元素的数量,但结构相同,它本质上是一个选项和相关内容表,CMS中的编辑器实际保存更改):


多功能
标题
对
对
听!字幕!
测试材料:

材料名称 东西

两条建议
  • 直接编写XSLT即可。需要动态计算XPath 表达式是你撞到复杂墙的标志。连头 不建议敲打
  • 或者,如果您真的必须发明自己的基于XML的模板语言,那么 编写XSLT将XML模板转换为XSLT,然后 直接执行生成的XSLT。机智
    <mus:layoutsheet org="msu" version="2"
    xmlns:mus="http://www.montana.edu/web/xsl/variables"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ou="http://omniupdate.com/XSL/Variables"
    exclude-result-prefixes="xsl mus ou">
    
        <mus:call-template name="pre-processing-pub" />     
        <mus:call-template name="doctype" />
        <html>
    
            <mus:call-template name="pre-processing"/>
    
            <mus:call-template name="head" />
            <body class="responsive">
                <mus:call-template name="header" />
    
                <div class="container">
                    <div class="row">
                        <mus:call-template name="titles-region" />
                        <mus:call-template name="breadcrumb" />
                    </div>
                </div>
    
                <div class="container" id="content">
    
                    <!-- this is the full width feature region -->
                    <mus:call-template name="banners-region" cond="ou:pcfparam('full-width-feature-area') = 'show'"/>
                    <!-- ok how do we do conditional placement? because this needs to get called in here or in content -->
                    <!-- how about having that as an attribute here, then we can react to that in the match-->
    
                    <div class="row">
    
                        <mus:call-template name="nested-nav" />
                        <!--wrap in an if statement for handling the different locations when tabbed -->                        
                        <div id="rightpane" class="col-xs-12 pull-right page-content sec">
                            <mus:call-template name="banners-region" cond="not(ou:pcfparam('full-width-feature-area') = 'show')"/>
    
                            <mus:call-template name="content" />
    
    
                        </div>                          
    
                        <mus:call-template name="contact-info" /> 
    
                    </div>
                </div>
                <!--<xsl:call-template name="bottom-span-bar" />    -->
    
                <mus:call-template name="footer" />
            </body>
        </html>
    </mus:layoutsheet>
    
    <xsl:template match="mus:call-template[@name='banners-region']">
        <xsl:if test="saxon:evaluate(@cond)">
            <xsl:call-template name="slider" /> 
        </xsl:if>
    </xsl:template>
    
    <?xml version="1.0" encoding="utf-8"?>
    <?pcf-stylesheet path="/multi-standard-new.xsl" site="XSL" extension="html"?>
    <!DOCTYPE document SYSTEM "/data/staging/oucampus/MSU-Bozeman/XSL/_resources/dtd/standard.dtd">
    <document xmlns:ouc="http://omniupdate.com/XSL/Variables">
        <parameter name="page-type">multi-feature</parameter>
    
    
        <ouc:properties label="metadata">
            <meta name="description" content="Description" />
            <meta name="keywords" content="Some keywords here" />
        </ouc:properties>
    
    
        <ouc:properties label="config">
            <title>The title</title>
    
            <!-- +++++++++++++++++++++++ -->
            <!-- Processing Instructions -->
            <!-- +++++++++++++++++++++++ -->
    
            <parameter
                name="page-subtitle"
                group="Everyone"
                type="checkbox"
                prompt="Show Subtitle"
                alt="Check to display the subtitle region."
            >
    <option value="show" selected="false">Yes</option>
    </parameter>
            <parameter section="Processing Instructions"
                name="page-preprocessing"
                group="tmplSettings_Processing"
                type="checkbox"
                prompt="Pre-processing"
                alt="Check to enable the pre-processing region. This region is for server side instructions which must run before any HTML."
            >
    <option value="show" selected="true">Yes</option>
    </parameter>
        </ouc:properties>
        <ouc:div label="page-subtitle"  group="Everyone"  button-class="oucEditButton" button-text="Subtitle" break="break" >
            <ouc:editor wysiwyg-class="page-subtitle" csspath="/_resources/ou/editor/maincontent.css" cssmenu="/_resources/ou/editor/menu.txt" width="955" />
    Hark! A Subtitle!
        </ouc:div>
    <ouc:div label="main-content"  group="Everyone"  button-class="oucEditButton" button-text="Main Content" break="break" ><ouc:editor csspath="/_resources/ou/editor/maincontent.css" cssmenu="/_resources/ou/editor/menu.txt" width="955" wysiwyg-class="main-content"/><div>testing stuff:</div>
    <div></div>
    <div></div>
    <hr class="tabs-start" />
    <h2>STUFF TITLE</h2>
    <p>Stuff</p>
    </ouc:div>
    </document>