在两个xslt变量

时间:2017-05-31 13:27:01

标签: arrays variables xslt xslt-1.0

我需要帮助,我可以将两个xslt变量存储在1个数组中,如稍后要使用的变量

    <xsl:variable name="edgeDeviceArray">
        <Item><xsl:value-of select="$edgeDev1" /></Item>
        <Item><xsl:value-of select="$edgeDev2" /></Item>
    </xsl:variable> 

但是上面的输出似乎是串联的。我想稍后再提一下像edgeDeviceArray [1] ......

这是我的样式表的一个(非工作)片段,展示了我想要做的事情

    <xsl:variable name="edgeDev1"
        select="$deviceDoc/x:config/t:devices/t:device[t:address=$edgeDev1IP]/t:name" />
    <xsl:variable name="edgeDev2"
        select="$deviceDoc/x:config/t:devices/t:device[t:address=$edgeDev2IP]/t:name" />
    <xsl:variable name="xrSet" select="$xrDeviceDoc/x:config/t:devices/t:device-module/t:devices" />

    <xsl:for-each select="$xrSet">
      <xsl:variable name="asideDoc"
          select="document(concat($edgeDevice[position()], '.xml'))" />
    </xsl:for-each>

在这里,我正在根据某些属性从1个doc中读取设备名称(如果它们匹配)。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:t="http://tail-f.com/ns/ncs"
    xmlns:x="http://tail-f.com/ns/config/1.0" 
    xmlns:y="http://tail-f.com/ned/alu-sr"
    xmlns:a="http://tail-f.com/ned/cisco-ios-xr"
    xmlns:m="http://mask.data"
    xmlns:im="http://inverse-mask.data" exclude-result-prefixes="xsl t x y"
    xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">

  <xsl:output method="xml" version="1.0" encoding="UTF-8"
      indent="yes" omit-xml-declaration="yes" />

  <xsl:template match="/">
    <xsl:variable name="deviceDoc" select="document('devices.xml')" />
    <xsl:variable name="edgeDev1IP"
        select="../y:sdp[y:sdp-id=$sdpSet[1]]/y:far-end" />
    <xsl:variable name="edgeDev1"
        select="$deviceDoc/x:config/t:devices/t:device[t:address=$edgeDev1IP]/t:name" />
    <xsl:variable name="edgeDev2IP"
        select="../y:sdp[y:sdp-id=$sdpSet[2]]/y:far-end" />
    <xsl:variable name="edgeDev2"
        select="$deviceDoc/x:config/t:devices/t:device[t:address=$edgeDev2IP]/t:name" />
    <xsl:variable name="xrDeviceDoc" select="document('xrDevices.xml')" />
    <xsl:variable name="xrSet"
        select="$xrDeviceDoc/x:config/t:devices/t:device-module/t:devices" />
    <xsl:variable name="edgeDeviceArray">
      <item><xsl:value-of select="$edgeDev1" /></item>
      <item><xsl:value-of select="$edgeDev2" /></item>
    </xsl:variable> 

    <anurag><xsl:value-of select="exsl:node-set($edgeDeviceArray)/item[1]" /></anurag>
  </xsl:template>
</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:1)

  

我想稍后再提及edgeDeviceArray [1]

这不会有两个原因:

  1. 只有一个edgeDeviceArray。为了引用它的第一个项目,你需要使用像$edgeDeviceArray/item[1]这样的东西;
  2. 在XSLT 1.0中,您的变量是结果树片段,必须先将其转换为 node-set ,然后才能通过XPath处理其内容。
  3. 这是一个最小化的例子:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:variable name="myVar">
        <item>A</item>
        <item>B</item>
    </xsl:variable> 
    
    <xsl:template match="/">
        <result>
            <xsl:value-of select="exsl:node-set($myVar)/item[2]"/>
        </result>
    </xsl:template>
    
    </xsl:stylesheet>
    

    <强>结果

    <?xml version="1.0" encoding="UTF-8"?>
    <result>B</result>