如何处理“.xsl”中的字符串数组文件?

发布于 2024-11-06 14:23:19 字数 240 浏览 1 评论 0原文

我在 .xsl 文件中有一个字符串数组,现在我必须以不同的方式使用由空格分隔的每个字符串。我怎样才能得到字符串?

我有以下字符串数组:

strarray="hw.oh.xml hg.hd.gnl th.ik.lkj"

我必须分别获取 "hw.oh.xml" 、 "hg.hd.gnl" 、 "th.ik.lkj" 字符串才能对其执行某些操作。

我怎样才能做到这一点?

I have an array of strings in .xsl file, now I have to use the each string separeted by spaces differently. How I can get the strings?

I have following array of strings:

strarray="hw.oh.xml hg.hd.gnl th.ik.lkj"

I have to get "hw.oh.xml" , "hg.hd.gnl" , "th.ik.lkj" strings separetaly to perform some operation on it.

How I can do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黯淡〆 2024-11-13 14:23:19

有很多方法可以做到这一点

I.使用 XPath substring-before()substring-after() 函数

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vStrArray" select="'hw.oh.xml hg.hd.gnl th.ik.lkj'"/>

 <xsl:template match="/">
  <xsl:value-of select="substring-before($vStrArray, ' ')"/>
  <xsl:text>
</xsl:text>

  <xsl:value-of select="substring-before(substring-after($vStrArray, ' '),' ')"/>
  <xsl:text>
</xsl:text>
  <xsl:value-of select="substring-after(substring-after($vStrArray, ' '),' ')"/>
  <xsl:text>
</xsl:text>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于任何 XML 文档时(未使用) ,生成想要的结果(“数组”中的每个项目)

hw.oh.xml
hg.hd.gnl
th.ik.lkj

此方法很快就会变得极其复杂,除了仅包含 2-3 个项目的“数组”外,不推荐使用此方法。

二.在 XSLT 1.0 中将“数组”表示为 XML 文档:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:array>
  <item>hw.oh.xml</item>
  <item>hg.hd.gnl</item>
  <item>th.ik.lkj</item>
 </my:array>

 <xsl:variable name="vStrArray"
      select="document('')/*/my:array/*"/>

 <xsl:template match="/">
  <xsl:value-of select="$vStrArray[1]"/>
  <xsl:text>
</xsl:text>

  <xsl:value-of select="$vStrArray[2]"/>
  <xsl:text>
</xsl:text>
  <xsl:value-of select="$vStrArray[3]"/>
  <xsl:text>
</xsl:text>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(任何)时,会生成所需的正确结果

hw.oh.xml
hg.hd.gnl
th.ik.lkj

我建议这种表示“数组”的方法——适用于 XSLT 1.0 应用程序

三. XSLT 2.0 / XPath 2.0

简单地使用字符串序列

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vStrArray"
      select="'hw.oh.xml', 'hg.hd.gnl', 'th.ik.lkj'"/>

 <xsl:template match="/">
  <xsl:sequence select=
   "for $i in 1 to count($vStrArray)
     return
        concat($vStrArray[$i], '
')
   "/>
 </xsl:template>
</xsl:stylesheet>

结果

 hw.oh.xml
 hg.hd.gnl
 th.ik.lkj

更新:OP评论说他被困在空格分隔值的初始表示形式,包含在单个字符串中。

四.将空格分隔的值字符串转换为 XML 片段以方便使用。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vStrArray" select="'hw.oh.xml hg.hd.gnl th.ik.lkj'"/>

    <xsl:variable name="vrtfDoc">
      <xsl:call-template name="makeIndex">
        <xsl:with-param name="pText" select="$vStrArray"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="vStrIndex" select="ext:node-set($vrtfDoc)/*"/>

    <xsl:template match="/">
        <xsl:value-of select="$vStrIndex[1]"/>
        <xsl:text>
</xsl:text>
        <xsl:value-of select="$vStrIndex[2]"/>
        <xsl:text>
</xsl:text>
        <xsl:value-of select="$vStrIndex[3]"/>
    </xsl:template>

  <xsl:template name="makeIndex">
     <xsl:param name="pText"/>

     <xsl:if test="string-length($pText)>0">
      <item>
       <xsl:value-of select=
         "substring-before(concat($pText,' '), ' ')"/>
      </item>
      <xsl:call-template name="makeIndex">
       <xsl:with-param name="pText" select=
       "substring-after($pText,' ')"/>
      </xsl:call-template>
     </xsl:if>
    </xsl:template>
</xsl:stylesheet>

此转换根据字符串创建一个 XML 片段,其中每个 元素仅包含一个字符串值。那么它的使用就像是一个数组一样。

There are many ways to do this:

I. Using the XPath substring-before() and substring-after() functions:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vStrArray" select="'hw.oh.xml hg.hd.gnl th.ik.lkj'"/>

 <xsl:template match="/">
  <xsl:value-of select="substring-before($vStrArray, ' ')"/>
  <xsl:text>
</xsl:text>

  <xsl:value-of select="substring-before(substring-after($vStrArray, ' '),' ')"/>
  <xsl:text>
</xsl:text>
  <xsl:value-of select="substring-after(substring-after($vStrArray, ' '),' ')"/>
  <xsl:text>
</xsl:text>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on any XML document (not used), the wanted result (each item from the "array") is produced:

hw.oh.xml
hg.hd.gnl
th.ik.lkj

This method can quickly become overwhelmingly complex and is not recommended except for "arrays" of just 2-3 items.

II. Representing the "array" as an XML document in XSLT 1.0:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:array>
  <item>hw.oh.xml</item>
  <item>hg.hd.gnl</item>
  <item>th.ik.lkj</item>
 </my:array>

 <xsl:variable name="vStrArray"
      select="document('')/*/my:array/*"/>

 <xsl:template match="/">
  <xsl:value-of select="$vStrArray[1]"/>
  <xsl:text>
</xsl:text>

  <xsl:value-of select="$vStrArray[2]"/>
  <xsl:text>
</xsl:text>
  <xsl:value-of select="$vStrArray[3]"/>
  <xsl:text>
</xsl:text>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the same XML document (any), the wanted correct result is produced:

hw.oh.xml
hg.hd.gnl
th.ik.lkj

I recommend this method of representing an "array" -- for XSLT 1.0 applications.

III. XSLT 2.0 / XPath 2.0

Simply use a sequence of strings:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vStrArray"
      select="'hw.oh.xml', 'hg.hd.gnl', 'th.ik.lkj'"/>

 <xsl:template match="/">
  <xsl:sequence select=
   "for $i in 1 to count($vStrArray)
     return
        concat($vStrArray[$i], '
')
   "/>
 </xsl:template>
</xsl:stylesheet>

Result:

 hw.oh.xml
 hg.hd.gnl
 th.ik.lkj

UPDATE: The OP commented that he is stuck with the initial representation of space-separated values, contained in a single string.

IV. Convert the space-separated values string into an XML fragment for easy use.

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vStrArray" select="'hw.oh.xml hg.hd.gnl th.ik.lkj'"/>

    <xsl:variable name="vrtfDoc">
      <xsl:call-template name="makeIndex">
        <xsl:with-param name="pText" select="$vStrArray"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="vStrIndex" select="ext:node-set($vrtfDoc)/*"/>

    <xsl:template match="/">
        <xsl:value-of select="$vStrIndex[1]"/>
        <xsl:text>
</xsl:text>
        <xsl:value-of select="$vStrIndex[2]"/>
        <xsl:text>
</xsl:text>
        <xsl:value-of select="$vStrIndex[3]"/>
    </xsl:template>

  <xsl:template name="makeIndex">
     <xsl:param name="pText"/>

     <xsl:if test="string-length($pText)>0">
      <item>
       <xsl:value-of select=
         "substring-before(concat($pText,' '), ' ')"/>
      </item>
      <xsl:call-template name="makeIndex">
       <xsl:with-param name="pText" select=
       "substring-after($pText,' ')"/>
      </xsl:call-template>
     </xsl:if>
    </xsl:template>
</xsl:stylesheet>

This transformation creates an XML fragment from the string in which every <item> element contains just one of the string values. Then its use is just as if it were an array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文