您好,
我有一个变量'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>
DESIRED-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'。但它并没有真正改变。
答案 0 :(得分:1)
好吧,我仍然不太了解你想要达到的目标的逻辑,但我当然可以看出你做错了什么;像XSLT这样的函数式语言中的变量是不可变的,并且你不能像处理循环那样处理for-each指令。
除非有其他算法来实现你想要实现的目标,否则你需要使用递归:编写一个处理一个“text”元素的模板,然后调用自己来处理其余的“text”元素,传递sortedKeywords的新值作为参数。
答案 1 :(得分:0)
由于变量无法变为全局变量,因此我使用以下方法进行排序,排序标记的值实际上不在单个标记内的标记。
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>