4

我有一个具有以下结构的 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

4 回答 4

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]" />
于 2012-09-03T12:39:51.410 回答
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>
于 2012-09-03T12:39:35.243 回答
3

I. 这是一种通用且强大的方法,可以在给定(增加)位置的情况下生成任何值的串联

<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

二、如果我们有任何(不一定增加)位置序列,事情会变得更有趣:

<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

三、这在 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>
于 2012-09-03T14:50:26.813 回答
1

您可以使用:

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

我希望这会有所帮助。

于 2015-04-17T00:48:37.040 回答