我有两个输出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属性。

10-05 23:03