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>