使用xslt 2.0将字符串模式转换为XML

时间:2012-07-23 14:47:43

标签: xml xslt xpath

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转换器

3 个答案:

答案 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;'如果合适的话