首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文本值存储在以前节点的变量中

将文本值存储在以前节点的变量中
EN

Stack Overflow用户
提问于 2010-11-04 10:19:55
回答 2查看 964关注 0票数 1

输入

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<XML>
    <Concept>
        <Heading-1>This is First Heading</Heading-1>
    </Concept>
    <Concept>
        <Heading-2>This is Second Heading</Heading-2>
    </Concept>
    <Concept>
        <Heading-2>This is First Heading</Heading-2>
    </Concept>
 </XML>

输出应该是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<name>This_is_First_Heading</name>
<name>This_is_Second_Heading</name>
<name>1_This_is_First_Heading</name>

样式表

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="2.0">
    <xsl:template match="Concept">
        <xsl:variable name="name" 
                      select="./Heading-1/text() | ./Heading-2/text()"/>
        <xsl:variable name="name1" 
                      select="if //Cocept/Heading-1/text()=$name 
                              then concat(position(), '_' $name)} 
                              else $name"/>
        <name>
            <xsl:value-of select="replace($name, ' ', '_' )"/>
        </name>
    </xsl:template>
</xsl:stylesheet>

问题:我需要在"name“元素下打印所有标题文本值。但是,如果前面的隐藏中存在类似的文本值,则应该在文本值之前添加position()号。我只需要通过变量来实现,如果您可以在变量name1中看到,我正在尝试放置一些逻辑来比较前一个标题的值,如果遇到类似的文本,则放置位置号,但不知为何无法做到这一点。你能帮我用变量name1写同样的逻辑吗?提前谢谢你的帮助。

______Edited___________

代码语言:javascript
复制
<xsl:template match="Concept">
    <xsl:variable name="name"
                  select="if (./Heading-1[1] |
                              ./Heading-2[1] |
                              ./Heading-3[1] |
                              ./Heading-4[1] |
                              ./Heading-5[1])
                          then normalize-space((Heading-1[1] |
                                                Heading-2[1] |
                                                Heading-3[1] |
                                                Heading-4[1] |
                                                Heading-5[1])
                                                /text()[position()=last()])
                          else normalize-space(./Heading-2[1]/text()[2])"/>
        <xsl:variable name="name1"
                      select="if (//Concept/Heading-3/text()
                                   [position()=last()] = $name)
                              then concat(position(), '_', $name)
                              else $name"></xsl:variable>
        <xsl:variable name="name2"
                      select="if (string-length($name5)=0)
                              then concat(position(), '_', $name5)
                              else $name5"/>
        <xsl:result-document href="XML/{replace($name2, ' ', '_')}.xml"
                             format="testing" validation="strip">
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-06 17:03:11

是最简单的XSLT2.0解决方案之一,

代码语言:javascript
复制
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="/*/*/*">
  <name>
    <xsl:sequence select=
     "concat(for $cnt in count(../preceding-sibling::*/*[. eq current()])
              return 
                if($cnt gt 0)
                  then concat($cnt, '_')
                  else (),
              .
             )
     "/>
  </name>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用时

代码语言:javascript
复制
<XML>
    <Concept>
        <Heading-1>This is First Heading</Heading-1>
    </Concept>
    <Concept>
        <Heading-2>This is Second Heading</Heading-2>
    </Concept>
    <Concept>
        <Heading-2>This is First Heading</Heading-2>
    </Concept>
 </XML>

生成想要的、正确的结果

代码语言:javascript
复制
<name>This is First Heading</name>
<name>This is Second Heading</name>
<name>1_This is First Heading</name>

如果需要在结果中生成的每个文本节点实际位于变量中,那么只需将上面的代码<xsl:sequence>中的文本节点替换为<xsl:variable>即可。

票数 0
EN

Stack Overflow用户

发布于 2010-11-04 14:40:54

下面是一个示例样式表,它生成您所要求的结果:

代码语言:javascript
复制
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="k1" match="Concept/*" use="."/>

  <xsl:template match="Concept/*">
    <xsl:variable name="preceding" select="key('k1', .)[. &lt;&lt; current()]"/>
    <name>
      <xsl:choose>
        <xsl:when test="$preceding">
          <xsl:value-of select="concat(count($preceding), '_', replace(., ' ', '_'))"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="replace(., ' ', '_')"/>
        </xsl:otherwise>
      </xsl:choose>
    </name>
  </xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4095652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档