可以将输入参数转换为 xml 结构吗?



我需要将像"1-410000 54-420987 63-32000"这样的输入参数字符串转换为XSLT中的结构(如下所示),以便稍后在xslt中使用其数据:

<config:categories>
  <category>
    <value>410000</value>
    <label>1</label>
  </category>
  <category>
    <value>420987</value>
    <label>54</label>
  </category>
  <category>
    <value>32000</value>
    <label>63</label>
  </category>
</config:categories>

附言是否有任何其他选项可以解析字符串,例如"1-410000 54-420987 63-32000",以便在输入文档中找到左侧部分,以便在 xslt 中使用其在 xslt 中的数据提取右侧部分(在"-"之后)?

此转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:config="some:config" exclude-result-prefixes="config">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:param name="pData" select="'1-410000 54-420987 63-32000'"/>
 <xsl:template match="/*">
     <config:categories>
       <xsl:call-template name="gen"/>
     </config:categories>
 </xsl:template>
 <xsl:template name="gen">
  <xsl:param name="pGen" select="$pData"/>
  <xsl:if test="$pGen">
   <xsl:variable name="vChunk" select=
    "substring-before(concat($pGen, ' '), ' ')"/>
      <category>
        <value><xsl:value-of select="substring-after($vChunk,'-')"/></value>
        <label><xsl:value-of select="substring-before($vChunk,'-')"/></label>
      </category>
      <xsl:call-template name="gen">
       <xsl:with-param name="pGen" select="substring-after($pGen, ' ')"/>
      </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

当应用于任何 XML 文档(未使用)时,将生成所需的正确结果

<config:categories xmlns:config="some:config">
   <category>
      <value>410000</value>
      <label>1</label>
   </category>
   <category>
      <value>420987</value>
      <label>54</label>
   </category>
   <category>
      <value>32000</value>
      <label>63</label>
   </category>
</config:categories>

解释

正确使用substring-before()substring-after()以及递归。

正如 Dimitre 所示,在 XSLT 1.0 中解析字符串非常麻烦。这是 XSLT 2.0 远远优于的领域。可以这样完成:

<categories>
  <xsl:for-each select="tokenize($param, 's+')">
    <category>
      <label><xsl:value-of select="substring-after(., '-')"/></label>
      <value><xsl:value-of select="substring-before(., '-')"/></value>
    </category>
  </xsl:for-each>
</categories>

当然,在 XSLT 2.0 中,您可以将类别结构用作第一类节点值,而无需使用 node-set() 扩展名进入它。

要从字符串制作 XML,我认为你必须使用 Java。我不知道 XSLT 功能可以实现这一点。

对于你的第二个问题:有 substring()、string-length()、substring-before() 和 substring-after() 可能有助于您的请求。请参考: http://www.w3schools.com/xpath/xpath_functions.asp

相关内容

  • 没有找到相关文章