Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xsl:如何分割字符串?_Xml_Xslt_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

Xml xsl:如何分割字符串?

Xml xsl:如何分割字符串?,xml,xslt,xslt-1.0,xslt-2.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,我想用分号拆分地址;分为行,行之间用: e、 g.如果地址=123 Elm Street,我想输出123 Elm Street 但如果地址=榆树街123号;邮政信箱222,我想输出 123 Elm Street<br />PO Box 222 有办法做到这一点吗?可能很简单,但我对XSLT不太熟悉 普通XSL选择器是 <xsl:value-of select="address"/> 我想修改这个XSLT片段,以分号分隔 更新:显然,答案涉及到函数substring b

我想用分号拆分地址;分为行,行之间用:

e、 g.如果地址=123 Elm Street,我想输出123 Elm Street

但如果地址=榆树街123号;邮政信箱222,我想输出

123 Elm Street<br />PO Box 222
有办法做到这一点吗?可能很简单,但我对XSLT不太熟悉

普通XSL选择器是

<xsl:value-of select="address"/>
我想修改这个XSLT片段,以分号分隔

更新:显然,答案涉及到函数substring before和substring after的使用


但是我是XSLT的初学者,我真的需要一些帮助来实现这一点。

如果您的XSLT处理器支持,您可以使用,否则,该链接包含一个使用以前的子字符串等函数的实现。

I.纯XSLT 1.0解决方案:

这一转变:

当此转换应用于任何未使用的XML文档时,会产生相同的、正确的结果:

三、 使用XSLT2.0

将此转换应用于此XML文档时:

产生所需的正确结果:


可能的重复也许这是一个近乎重复的问题,但我不知道如何将这个问题的答案应用到我的问题上。看看我是如何发现的?我的XSLT处理器是一个web浏览器,Firefox 3.6或Safari 5。0@Jason在这种情况下,你不能依赖它,你需要自己提供函数;该实现可在链接的站点上使用。下面是一个示例:您能否解释not$pText=。语法?问题是什么。你在干什么?@Jason-S:。在XSLT和XPath中,表示当前节点上下文节点。不是$pText=。如果参数$pText的字符串值不等于当前节点的字符串值,则为true-我们只希望在这种情况下输出,否则我们的输出将以我是否可以将已存在的变量传递给param name=pText?@Perdomoff开始,是,在XSLT中,的select属性中提供的参数可以是任何XPath表达式,变量引用是有效的XPath表达式。在XSLT 2.0及更高版本中调用`时,为参数提供值也是如此。这确实有效,谢谢。我可以从另一个xsl文件传递变量吗?
<xsl:value-of select="address"/>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="text()" name="split">
  <xsl:param name="pText" select="."/>
  <xsl:if test="string-length($pText)">
   <xsl:if test="not($pText=.)">
    <br />
   </xsl:if>
   <xsl:value-of select=
    "substring-before(concat($pText,';'),';')"/>
   <xsl:call-template name="split">
    <xsl:with-param name="pText" select=
     "substring-after($pText, ';')"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>
<t>123 Elm Street;PO Box 222;c/o James Jones</t>
123 Elm Street<br />PO Box 222<br />c/o James Jones
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="xsl f testmap"
>
   <xsl:import href="str-dvc-map.xsl"/>

   <testmap:testmap/>

   <xsl:output omit-xml-declaration="yes" indent="yes"/>

   <xsl:template match="/">
     <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>
     <xsl:call-template name="str-map">
       <xsl:with-param name="pFun" select="$vTestMap"/>
       <xsl:with-param name="pStr" select=
       "'123 Elm Street;PO Box 222;c/o James Jones'"/>
     </xsl:call-template>
   </xsl:template>

    <xsl:template name="replace" mode="f:FXSL"
         match="*[namespace-uri() = 'testmap']">
      <xsl:param name="arg1"/>

      <xsl:choose>
       <xsl:when test="not($arg1=';')">
        <xsl:value-of select="$arg1"/>
       </xsl:when>
       <xsl:otherwise><br /></xsl:otherwise>
      </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
123 Elm Street<br/>PO Box 222<br/>c/o James Jones
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="text()">
  <xsl:for-each select="tokenize(.,';')">
   <xsl:sequence select="."/>
   <xsl:if test="not(position() eq last())"><br /></xsl:if>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
<t>123 Elm Street;PO Box 222;c/o James Jones</t>
123 Elm Street<br />PO Box 222<br />c/o James Jones