在XSLT中,我们可以使用xsl:analyze-string通过regex表达式检查输入字符串,得到regex-group。
例如,我有以下几串形状:
区段:20米
三角形: 30m 30m 30m
矩形: 10m 10m 30m 30m
...so on (但它是有限的)
我想使用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种以上的形状,就会有非常丑陋的代码。
解决此问题的最好方法是将switch case或if else-if语法集成到xsl:analyze-string中。
那么有没有办法在XSLT中切换大小写xsl:analyze-string呢?
发布于 2018-01-13 23:52:51
使用模板匹配。
在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)是一个节点序列,而不是一个字符串序列,就可以使用相同的技术。
https://stackoverflow.com/questions/48239880
复制相似问题