首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XSLT 1: XPath -从字符串中选择/提取一个具有默认值的数字

XSLT 1: XPath -从字符串中选择/提取一个具有默认值的数字
EN

Stack Overflow用户
提问于 2014-02-07 07:50:45
回答 2查看 151关注 0票数 0

我正在使用由开箱即用的Java 6提供的XSL引擎来转换文档。

我需要从属性中获取一个值,并将其用作要转换到的文档中的索引属性。

例如,元素:

代码语言:javascript
复制
<myElem bogen="K [1]"/>

属性“bogen”可能具有以下值:

“K1”“K2”达到'n‘值。它还可以简单地使用"K“来表示与”K1“相同的内容。

相应的转换结果(来自“K1”)如下所示:

代码语言:javascript
复制
<myTransformedElem index="1"/>

我可以利用这个转换:

代码语言:javascript
复制
<xsl:value-of select="translate(@bogen,translate(@bogen, '0123456789', ''), '')"/>

如果只是被期望为“K1”的值。但是如果没有实际的数字,比如"K",这就把我塞满了。

我唯一能做到的方法是,如果我滥用'number‘函数,期望得到一个'NaN’并翻译它。这看起来太丑了。

例如:

代码语言:javascript
复制
<xsl:value-of select="translate(string(number(translate(@bogen,translate(@bogen, '0123456789', ''), ''))), 'aN', '1')"/>

每次都能得到正确的结果。

在XSLT中是否有更好、更好的方法来做到这一点而不诉诸自定义方法(即导入静态java方法)?

例如,如果我需要一个多字符字符串的默认值,我就不能使用上面的解决方案。

提前谢谢。

肖恩

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 08:02:36

使用此XSL:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="myElem">
        <xsl:choose>
            <xsl:when test="translate(@bogen, '0123456789', '') != @bogen">
                <myTransformedElem index="{translate(@bogen,translate(@bogen, '0123456789', ''), '')}"/>
            </xsl:when>
            <xsl:otherwise>
                <myTransformedElem index="1"/>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

</xsl:stylesheet>

应用于此XML时:

代码语言:javascript
复制
<root>
    <myElem bogen="K"/>
</root>

产生

代码语言:javascript
复制
<myTransformedElem index="1"/>

当应用于此XML时:

代码语言:javascript
复制
<root>
    <myElem bogen="K [2]"/>
</root>

产生

代码语言:javascript
复制
<myTransformedElem index="2"/>
票数 1
EN

Stack Overflow用户

发布于 2014-02-07 08:05:55

有一种方法可以做到这一点:

代码语言:javascript
复制
  <xsl:template name="GetIndex">
    <xsl:param name="value" />
    <xsl:param name="default" select="1" />

    <xsl:variable name="foundIndex"
                  select="substring-before(
                             substring-after($value, '['), ']')" />
    <xsl:choose>
      <xsl:when test="$foundIndex">
        <xsl:value-of select="$foundIndex"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$default"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

此调用生成值1

代码语言:javascript
复制
<xsl:call-template name="GetIndex">
  <xsl:with-param name="value" select="'K[1]'" />
</xsl:call-template>

此调用生成值37

代码语言:javascript
复制
<xsl:call-template name="GetIndex">
  <xsl:with-param name="value" select="'K[37]'" />
</xsl:call-template>

此调用生成值1

代码语言:javascript
复制
<xsl:call-template name="GetIndex">
  <xsl:with-param name="value" select="'K'" />
</xsl:call-template>

此调用生成值999

代码语言:javascript
复制
<xsl:call-template name="GetIndex">
  <xsl:with-param name="value" select="'K'" />
  <xsl:with-param name="default" select="999" />
</xsl:call-template>

如果您发现xsl:choose太冗长,您可以这样重写GetIndex并获得相同的结果:

代码语言:javascript
复制
  <xsl:template name="GetIndex">
    <xsl:param name="value" />
    <xsl:param name="default" select="1" />

    <xsl:variable name="foundIndex"
                  select="substring-before(
                             substring-after($value, '['), ']')" />

    <xsl:value-of select="concat($foundIndex, 
                                 substring($default, 1, 
                                           not($foundIndex) * 
                                           string-length($default)))"/>
  </xsl:template>

就我个人而言,我认为xsl:choose的版本更清晰,即使它更长。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21622138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档