我有一个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。我该怎么做?
答案 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() <= 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() <= 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() < 4] , '')" />
我希望这可以提供帮助。