我有两个输出xml数据的函数。理想情况下,我希望将每个函数的输出合并为一个变量来解析数据。
在sql术语中,每个函数都可以通过pageid属性的内部连接连接在一起…但是xslt中不允许连接(至少据我所知)。
关于如何最干净/最简单地组合这些功能,有什么建议吗?我调用的函数内置于CMS中,无法编辑。
更多信息:
第一个功能是站点地图。它列出了网站的网页ID及其级别。
第二个函数将我需要的网页id及其元数据标记与站点地图结合起来。
我考虑过为第二个函数页id创建变量,但是带有元数据标记的页数发生了变化,我不相信这些变量支持动态名称。
如果我不够清楚,我很抱歉,因为xslt对我来说是新的。如果需要更多信息,请告诉我。
编辑:添加代码示例
<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<in:result name="SitemapXml">
<Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns="">
<Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
<Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/>
</Page>
</Page>
</in:result>
<in:result name="GetisrootXml">
<isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/>
<isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/>
</in:result>
</in:inputs>
我想要的是:
<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<in:result name="SitemapXml">
<Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns="" isroot='true'>
</Page>
<Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
<Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/>
</in:result>
</in:inputs>
由此,我想进一步更改输出以满足我的需要(添加用于显示的标记)。为了达到这一点,需要将isroot属性附加到站点地图。
最佳答案
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kIsRootByPageId" match="isroot" use="@PageId"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="in:result[1]/Page">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="key('kIsRootByPageId',@Id )/@isroot"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="in:result[2]"/>
</xsl:stylesheet>
当应用于提供的XML文档时:
<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<in:result name="SitemapXml">
<Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns=""></Page>
<Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
<Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/></Page>
</in:result>
<in:result name="GetisrootXml">
<isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/>
<isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/>
</in:result>
</in:inputs>
产生所需的正确结果:
<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<in:result name="SitemapXml">
<Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" isroot="true"/>
<Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen="true">
<Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen="true" iscurrent="true"
Depth="2"/>
</Page>
</in:result>
</in:inputs>
说明:
identity rule按原样复制选择要执行此模板的每个节点。
有两个覆盖模板,其中第二个模板“删除”其空正文第二次出现
in:result
。第一个重写模板与任何
Page
匹配,这些in:result
是第一个出现isroot
的子级。我们使用键高效方便地找到引用当前Page
属性的PageId
元素,并复制其isroot
属性。