MSH.1:MSH.2:MSH.3:PID.1:PID.2:ORC.1:ORC.3
上面的字符串模式我想转换成下面的XML格式
<filters>
<element group="MSH">
<location path="MSH.1"/>
<location path="MSH.2"/>
<location path="MSH.3"/>
</element>
<element group="PID">
<location path="PID.1"/>
<location path="PID.2"/>
</element>
<element group="ORC">
<location path="ORC.1"/>
<location path-"ORC.3"/>
</elment>
</filters>
我可以使用示例XSLT来实现上述场景
注意:我正在使用XSLT 2.0和saxon转换器
答案 0 :(得分:3)
假设您使用参数
在Saxon中开始转换-it:main in=MSH.1:MSH.2:MSH.3:PID.1:PID.2:ORC.1:ORC.3
试
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="in"/>
<xsl:template name="main">
<filters>
<xsl:variable name="tokens" select="tokenize($in, ':')"/>
<xsl:for-each-group select="$tokens" group-by="substring-before(., '.')"/>
<element group="{current-grouping-key()}">
<xsl:for-each select="current-group()">
<location path="{.}"/>
</xsl:for-each>
</element>
</xsl:for-each-group>
</filters>
<xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
您可以使用XSLT 2.0中的unparsed-text()函数将文档作为字符串变量加载。
然后,您可能会使用xsl:analyze-string指令来拆分字符串,首先是":"
字符,然后是句点字符。
答案 2 :(得分:0)
XSLT旨在操纵XML(转换为其他内容)。 因此,您必须首先对字符串进行XML格式化,至少
<xmlize>MSH.1:MSH.2:MSH.3:PID.1:PID.2:ORC.1:ORC.3</xmlize>
然后,您可以在根元素上进行XSLT匹配,并且可以使用`tokenize()'来处理字符串。见discussion
使用XSLT做这件事有点奇怪;你不能使用具有正则表达式拆分的字符串操作函数的其他脚本/语言吗?
nb:当你“xmlize”时,不要忘记逃避'&lt;' '&GT;'和'&amp;'如果合适的话