限制名称为127个字符的变量,保留整个名称

时间:2015-01-13 11:04:36

标签: xslt-2.0

我有这个xml:

<Artists>
<Name>Name1</Name>
<Name>Name2</Name>
<Name>Name3</Name>
<Name>Name4</Name>
<Name>Name5</Name>
...
<Name>Namex</Name>
</Artists>

我不知道这个名单有多长。

我想最终得到类似的东西:

<Limit_Artists>Name1; Name2; Name3; Name4; Name5; Name(n)</Limit_Artists>

但是,总长度不得超过127个字符和姓氏不得在中间“分开”。换句话说,我只需要从列表顶部获得尽可能多的全名,即127个字符。

我可以将名称放在变量中。但我怎么能在127个字符之前停止?

最好的问候..

1 个答案:

答案 0 :(得分:0)

效率不高,但

<xsl:template match="Artists">
  <Limit_Artists>
   <xsl:value-of select="Name[string-length(string-join((preceding-sibling::Name, .), '')) le 127]" separator="; "/>
  </Limit_Artists>
</xsl:template>

应该这样做。

完整的例子是

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:param name="limit" as="xs:integer" select="127"/>

<xsl:template match="Artists">
  <Limit_Artists>
   <xsl:value-of select="Name[string-length(string-join((preceding-sibling::Name, .), '')) le $limit]" separator="; "/>
  </Limit_Artists>
</xsl:template>

</xsl:stylesheet>

请注意,代码仅计算Name元素的内容,但输出它们由;连接,因此输出可能长于127.如果要将输出限制为127个字符,则您必须更改string-join来电使用

<xsl:template match="Artists">
  <Limit_Artists>
   <xsl:value-of select="Name[string-length(string-join((preceding-sibling::Name, .), '; ')) le 127]" separator="; "/>
  </Limit_Artists>
</xsl:template>

分别是

的完整示例
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:param name="limit" as="xs:integer" select="127"/>

<xsl:template match="Artists">
  <Limit_Artists>
   <xsl:value-of select="Name[string-length(string-join((preceding-sibling::Name, .), '; ')) le $limit]" separator="; "/>
  </Limit_Artists>
</xsl:template>

</xsl:stylesheet>

或者你可以沿着下面的兄弟轴使用兄弟递归,收集项目的长度,直到达到你想要限制输出的长度。一个完整的例子是

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:param name="limit" as="xs:integer" select="127"/>

<xsl:template match="Artists">
  <Limit_Artists>
    <xsl:apply-templates select="Name[1]">
      <xsl:with-param name="limit" select="$limit"/>
    </xsl:apply-templates>
  </Limit_Artists>
</xsl:template>

<xsl:template match="Artists/Name">
  <xsl:param name="limit" as="xs:integer"/>
  <xsl:param name="length" as="xs:integer" select="0"/>
  <xsl:variable name="new-length" select="$length + string-length()"/>
  <xsl:if test="$new-length le $limit">
    <xsl:value-of select="if ($length eq 0) then . else concat('; ', .)"/>
    <xsl:apply-templates select="following-sibling::Name[1]">
      <xsl:with-param name="limit" select="$limit"/>
      <xsl:with-param name="length" select="$new-length"/>
    </xsl:apply-templates>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

上面的示例也只对Name个字符进行计数,但是将它们连接在一起,因此如果要将输出限制为127个字符,则需要对其进行调整。这可以按如下方式完成:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:param name="limit" as="xs:integer" select="127"/>
<xsl:param name="sep" as="xs:string" select="'; '"/>

<xsl:template match="Artists">
  <Limit_Artists>
    <xsl:apply-templates select="Name[1]">
      <xsl:with-param name="limit" select="$limit"/>
    </xsl:apply-templates>
  </Limit_Artists>
</xsl:template>

<xsl:template match="Artists/Name">
  <xsl:param name="limit" as="xs:integer"/>
  <xsl:param name="length" as="xs:integer" select="0"/>
  <xsl:variable name="new-length" select="if ($length eq 0) then string-length() else $length + string-length($sep) + string-length()"/>
  <xsl:if test="$new-length le $limit">
    <xsl:value-of select="if ($length eq 0) then . else concat($sep, .)"/>
    <xsl:apply-templates select="following-sibling::Name[1]">
      <xsl:with-param name="limit" select="$limit"/>
      <xsl:with-param name="length" select="$new-length"/>
    </xsl:apply-templates>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>