需要有关使用包含和子串的xsl选择的建议

时间:2012-03-22 00:25:05

标签: xslt xpath substring contains

我认为我有这个工作,但我需要建议。我想知道这是否适合我的要求。 我需要根据该元素中包含的内容对元素应用不同的转换规则。我试图搜索'xsl'和'choose','contains','substring'。我似乎无法找到适用于这种情况的解决方案。

以下是此元素的各种方案:

  1. 如果它以U开头,我需要在'/'

    之前的所有内容
    • 原始值:UJXXXXX / 001

    • 转型:UJXXXXX

  2. 如果它以ECG_001开头,我需要ECG_001之后的所有内容

    • 原始值:ECG_0012345678

    • 转型:12345678

  3. 如果它不符合上述标准且包含'/',请在'/'后面加上

    • 原值:F5M / 12345678

    • 转型:12345678

  4. 如果不符合1,2或3只给我值

    • 原值:12345678

    • 转型:12345678

  5. 这是我到目前为止所做的:

    <xsl:variable name="CustomerPO">
            <xsl:choose>
                <xsl:when test="contains(substring(rma/header/CustomerPO,1,1), 'U')">
                    <xsl:value-of select="substring-before(rma/header/CustomerPO,'/')"/>
                </xsl:when>
                <xsl:when test="contains(rma/header/CustomerPO, 'ECG_001')">
                    <xsl:value-of select="substring-after(rma/header/CustomerPO,'ECG_001')"/>
                </xsl:when>
                <xsl:when test="contains(rma/header/CustomerPO, '/')">
                    <xsl:value-of select="substring-after(rma/header/CustomerPO, '/')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="rma/header/CustomerPO"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
    

    任何有关潜在漏洞的反馈或更有效的方法来实现这一点都值得赞赏。

    感谢。

2 个答案:

答案 0 :(得分:1)

你的XSLT看起来很好。您可以考虑使用starts-with函数而不是substring,我觉得它更容易阅读,但我不确定它是否更快。

答案 1 :(得分:0)

我自己的风格是使用模板规则。

<xsl:template match="CustomerPO[starts-with(., 'U')]">
  <xsl:value-of select="substring-before(., '/')"/>
</xsl:template>

<xsl:template match="CustomerPO[starts-with(., 'ECG_001')]">
  <xsl:value-of select="substring-after(., 'ECG_001')"/>
</xsl:template>