如何在XSLT中制作可变全局

  • 本文关键字:全局 XSLT xml xslt-1.0
  • 更新时间 :
  • 英文 :


hi

我有一个变量" sortedkeywords"其值是'1#5#13-14#9-10-11#7#3'。在循环时(在满足特定条件时),我希望第一个数字,然后从变量中删除"#"。

XML:

<root>
    <kwd-group>
        <title>Keywords</title>
            <u>ddd</u>
        <kwd>ZBustard</kwd>
            <u>, </u>
        <kwd>Grassland conservation</kwd>
            <u>, </u>
        <kwd>Tonle Sap</kwd>
            <u>, </u>
        <kwd>Irrigated rice</kwd>
        <kwd><it>bss</it></kwd>
        <kwd><it>ggggbss</it></kwd>
            <u>, </u>
        <kwd>Habitat conversion</kwd>
        <kwd><b>bold</b></kwd>
            <u>.</u>
    </kwd-group>
</root>

所需-XML:

   <?xml version="1.0" encoding="UTF-8"?><root>
    <kwd-group>
        <title>Keywords</title>
            <u>, </u>
        <kwd>Grassland conservation</kwd>
            <u>, </u>
        <kwd>Habitat conversion</kwd>
        <kwd><b>bold</b></kwd>
            <u>, </u>
        <kwd>Irrigated rice</kwd>
        <kwd><it>bss</it></kwd>
        <kwd><it>ggggbss</it></kwd>
            <u>, </u>
        <kwd>Tonle Sap</kwd>
            <u>ddd</u>
        <kwd>ZBustard</kwd>
            <u>.</u>
    </kwd-group>
</root>

XSLT:

    <xsl:variable name="sortedKeywords" select="1#5#13-14#9-10-11#7#3"/>
      <xsl:for-each select="text">
         <xsl:choose>
           <xsl:when test="kwd and (../text/u or ../text/st)">
               <xsl:variable name="pos" select="replace($sortedKeywords,'^([0-9]+)#.*?$','$1')"/>
***** Line 6  ******   <xsl:variable name="sortedKeywords" select="replace($sortedKeywords,'^[0-9]+#(.*?)$','$2')"/>
              <xsl:copy-of select="../text[position()=number($pos)]"/>
           </xsl:when>
           <xsl:otherwise>
               <xsl:copy-of select="."/>
           </xsl:otherwise>
         </xsl:choose>
      </xsl:for-each>

第6行改变了变量" sortedKeywords"。但是它并没有真正改变。

好吧,我仍然不太了解您要实现的目标的逻辑,但是我当然可以看到您在做错了什么;像XSLT这样的功能语言中的变量是不可变的,您不能以与程序循环相同的方式对待for-to-for-to-for。

除非还有其他一些算法可以实现您要实现的目标,否则您需要使用递归:编写一个处理一个"文本"元素的模板,然后称自己为处理其余的"文本"元素,排序键的新值作为参数。

由于不能使变量全局化,所以我使用以下方法进行排序,该方法的挑战是对值实际上不在单个标签内的标签进行排序。

xslt-solution ::

<xsl:template match="*|@*|comment()|processing-instruction()|text()">
  <xsl:copy>
    <xsl:apply-templates select="*|@*|comment()|processing-instruction()|text()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="kwd-group">
  <xsl:copy>
    <xsl:apply-templates select="title"/>
    <xsl:apply-templates select="kwd[preceding-sibling::*[1][self::u]]">
      <xsl:sort select="string(.)" />            
    </xsl:apply-templates>
    <xsl:apply-templates select="u[last()]"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="kwd[preceding-sibling::*[1][self::u]]">
  <xsl:apply-templates select="preceding-sibling::*[1][self::u]"/>
  <xsl:copy><xsl:apply-templates/></xsl:copy>
  <xsl:apply-templates select="following-sibling::kwd[not(preceding-sibling::*[1][self::u]) and preceding-sibling::u[1][following-sibling::*[1][self::kwd]=current()]]"/>
</xsl:template>

</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新