我有一个字符串,可以包含多个代码,例如LP或1S。我基本上需要能够在此字符串中搜索值列表(LP | 1S)。
这些值始终是可变的,如果出现某些代码,那么我需要在其后添加子字符串以根据某些映射获取其他数据。
例如,在LP是类型(LP)之后,是星期(1),日期,公共汽车(0800)和位置(1884)。
请参见下面的代码:
我当时想使用if ...包含LP,然后包含子字符串。但是,我只能在文本上添加一个子字符串一次。我可以为每个字符串使用a并继续对字符串进行子字符串化,直到字符串结尾吗?
LP12018122908001884CA212345LP120181229080018841S12345
<root>
<entry>
<type>LP</type>
<week>1</week>
<date>20181229</date>
<location>08001884</location>
<entry>
<entry>
<type>CA</type>
<week>2</week>
<location>212345</location>
<entry>
<entry>
<type>LP</type>
<week>1</week>
<date>20181229</date>
<location>08001884</location>
<entry>
<entry>
<type>1S</type>
<location>12345</location>
<entry>
</root>
答案 0 :(得分:1)
假设我们正在讨论解析固定宽度输入:
在XSLT 2.0中,使用正则表达式和xsl:analyze-string
很容易做到这一点:
XML
<input>LP12018122908001884LP22018122908001884LP72018122908001884</input>
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:analyze-string select="input" regex="(.{{2}})(.)(.{{8}})(.{{8}})">
<xsl:matching-substring>
<entry>
<type><xsl:value-of select="regex-group(1)"/></type>
<week><xsl:value-of select="regex-group(2)"/></week>
<date><xsl:value-of select="regex-group(3)"/></date>
<location><xsl:value-of select="regex-group(4)"/></location>
</entry>
</xsl:matching-substring>
</xsl:analyze-string>
</output>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<entry>
<type>LP</type>
<week>1</week>
<date>20181229</date>
<location>08001884</location>
</entry>
<entry>
<type>LP</type>
<week>2</week>
<date>20181229</date>
<location>08001884</location>
</entry>
<entry>
<type>LP</type>
<week>7</week>
<date>20181229</date>
<location>08001884</location>
</entry>
</output>
演示:http://xsltransform.hikmatu.com/3NzcBsL
在XSLT 1.0中执行相同的操作要复杂一些:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<root>
<xsl:call-template name="create-entries">
<xsl:with-param name="string" select="input"/>
</xsl:call-template>
</root>
</xsl:template>
<xsl:template name="create-entries">
<xsl:param name="string"/>
<xsl:variable name="entry" select="substring($string, 1, 19)" />
<entry>
<type><xsl:value-of select="substring($entry, 1, 2)"/></type>
<week><xsl:value-of select="substring($entry, 3, 1)"/></week>
<date><xsl:value-of select="substring($entry, 4, 8)"/></date>
<location><xsl:value-of select="substring($entry, 13, 8)"/></location>
</entry>
<xsl:if test="string-length($string) > 19">
<!-- recursive call -->
<xsl:call-template name="create-entries">
<xsl:with-param name="string" select="substring($string, 20)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>