在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?
答案 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)是一系列节点,而不是一系列字符串。