Как обрабатывать массив строк в файле ".xsl"? - PullRequest
1 голос
/ 10 мая 2011

У меня есть массив строк в файле .xsl, теперь я должен по-разному использовать каждую строку, разделенную пробелами.Как я могу получить строки?

У меня есть следующий массив строк:

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

Мне нужно получить "hw.oh.xml", "hg.hd.gnl", "th.ik.lkj "отдельные строки для выполнения какой-либо операции над ним.

Как я могу это сделать?

1 Ответ

4 голосов
/ 10 мая 2011

Есть много способов сделать это :

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>&#xA;</xsl:text>

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

, когда это преобразование применяется к любому документу XML (не используется), требуемый результат (каждый элемент из "массив ") создается :

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

Этот метод может быстро стать чрезвычайно сложным и не рекомендуется, за исключением" массивов "из 2-3 элементов.

II.Представляя «массив» в виде XML-документа в 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>&#xA;</xsl:text>

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

, когда это преобразование применяется к тому же XML-документу (любому), требуемый правильный результат получается :

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

Я рекомендую этот метод представления «массива» - для приложений XSLT 1.0 .

III.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], '&#xA;')
   "/>
 </xsl:template>
</xsl:stylesheet>

Результат :

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

ОБНОВЛЕНИЕ : ОП отметил, что он застрял с начальным представлением разделенных пробелами значений, содержащихся в одной строке.

IV.Преобразование строки значений, разделенных пробелами, во фрагмент 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>&#xA;</xsl:text>
        <xsl:value-of select="$vStrIndex[2]"/>
        <xsl:text>&#xA;</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 из строки, в которой каждый элемент <item> содержит только одно из значений строки,Тогда его использование так же, как если бы это был массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...