如何切换大小写xsl:analyze-string而不是嵌套?

时间:2018-01-13 12:29:33

标签: xslt

在XSLT中,我们可以使用xsl:analyze-string检查带有regex表达式的输入字符串并获取regex-group。

例如,我有以下形状的字符串:

段:20米

三角形:30m 30m 30m

矩形:10米10米30米30米

...等等(但它是有限的)

我想使用xml元素用xsl:analyze-string标记它们。

方法1:

<xsl:for-each select="$lines">
    <xsl:analyze-string select="." regex="segment: (\w*)">
        <xsl:matching-substring>
            <segment seg1="{regex-group(1)}"/>
        </xsl:matching-substring>
    </xsl:analyze-string>

    <xsl:analyze-string select="." regex="triangle: (\w*), (\w*), (\w*)">
        <xsl:matching-substring>
            <triangle seg1="{regex-group(1)}" seg2="{regex-group(2)}" seg3="{regex-group(3)}"/>
        </xsl:matching-substring>
    </xsl:analyze-string>

    <xsl:analyze-string select="." regex="rectangle: (\w*), (\w*), (\w*), (\w*)">
        <xsl:matching-substring>
            <rectangle seg1="{regex-group(1)}" seg2="{regex-group(2)}" seg3="{regex-group(3)}" seg4="{regex-group(4)}"/>
        </xsl:matching-substring>
    </xsl:analyze-string>
 </xsl:for-each>

这种方法有一个缺点,那就是:如果我们有一些不规则的数据,它会忽略,但它应该报告错误信息。

方法2:

在xsl:non-matching-substring元素中嵌套xsl:analyze-string,但如果我有超过8种Shape,那么会有非常难看的代码。

解决此问题的最佳方法是在xsl:analyze-string中集成switch case或if else-if语法。

那么有没有办法在XSLT中切换大小写xsl:analyze-string?

1 个答案:

答案 0 :(得分:0)

使用模板匹配。

在XSLT 3.0中:

  <xsl:template match=".[starts-with(., 'segment)]">
    <xsl:analyze-string select="." regex="segment: (\w*)">
        <xsl:matching-substring>
            <segment seg1="{regex-group(1)}"/>
        </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:template>

  <xsl:template match=".[starts-with(., 'triangle)]">
    <xsl:analyze-string select="." regex="triangle: (\w*), (\w*), (\w*)">
        <xsl:matching-substring>
            <triangle seg1="{regex-group(1)}" seg2="{regex-group(2)}" seg3="{regex-group(3)}"/>
        </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:template>

然后

<xsl:apply-templates select="$lines"/>

与原子值匹配的模板规则是3.0中的新规则。在2.0中,您可以使用相同的技术,前提是输入($ lines)是一系列节点,而不是一系列字符串。