如何在XSL中连接数据?

时间:2012-09-03 12:30:12

标签: xslt

我有一个XML文件,结构如下:

<root>
    <level1>
        <level2>
            <value>A</value>
            <value>B</value>
            <value>C</value>
            <value>D</value>
            <value>E</value>
            <value>F</value>
        </level2>
    </level1>
</root>

猜猜我想只连接XSL中的前三个值才能获得ABC。我该怎么做?

4 个答案:

答案 0 :(得分:6)

假设焦点项是level2节点,您可以使用XSLT 1.0序列构造函数,如...

<xsl:value-of select="concat(value[1],value[2],value[3])" />

...或者在XSLT 2.0中......

<xsl:value-of select="for $i in 1 to 3 return value[$i]" />

答案 1 :(得分:3)

您可以使用一个XPath执行此操作:

/root/level1/level2/value[position() &lt;= 3]/text()

将它放入XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:copy-of select="root/level1/level2/value[position() &lt;= 3]/text()" />
  </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:3)

<强>予。这是一种通用且有效的方法来生成给定(增加)位置的任何值的串联:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions" select="'|1|2|3|'"/>

 <xsl:template match="value">
     <xsl:if test="contains($pPositions, concat('|',position(),'|'))">
      <xsl:value-of select="."/>
     </xsl:if>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<root>
    <level1>
        <level2>
            <value>A</value>
            <value>B</value>
            <value>C</value>
            <value>D</value>
            <value>E</value>
            <value>F</value>
        </level2>
    </level1>
</root>

产生了想要的正确结果:

ABC

我们是否希望连接第1个,第3个和第6个value元素值,我们只提供相应的$pPositions参数

 <xsl:param name="pPositions" select="'|1|3|6|'"/>

并且相同的,未更改的XSLT代码现在生成所需的

ACF

<强> II。如果我们有任何(不一定增加的)职位序列,事情会变得更有趣:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions">
  <p>4</p>
  <p>1</p>
  <p>3</p>
 </xsl:param>

 <xsl:variable name="vPositions" select=
      "document('')/*/xsl:param[@name='pPositions']"/>

 <xsl:template match="/">
  <xsl:variable name="vDoc" select="."/>

  <xsl:for-each select="$vPositions/p">
    <xsl:value-of select="$vDoc/*/*/*/value[position()=current()]"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

当应用于同一个XML文档(上图)时,我们会得到想要的正确结果:

DAC

<强> III。这在XSLT 2.0中是微不足道的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions" as="xs:integer*" select="4,1,3"/>

 <xsl:template match="/">
  <xsl:value-of separator="" select=
   "for $n in $pPositions
     return
        /*/*/*/value[$n]
   "/>
 </xsl:template>
</xsl:stylesheet>

答案 3 :(得分:1)

你可以使用:

<xsl:value-of select=".//level2/string-join(value[position() &lt; 4] , '')" />        

我希望这可以提供帮助。