使用子节点子字符串创建新节点 [英] Make new node using sub-node sub-string

查看:5
本文介绍了使用子节点子字符串创建新节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下所示的XML文档:

<oldEle userlabel="label1">
  <ele1>%02d.jpeg</ele1>
</oldEle>

<oldEle userlabel="label2">
  <ele1>%02d.tiff</ele1>
</oldEle>

我希望是这样的:

<JPEG userlabel="label1">
  <ele1>%02d.jpeg</ele1>
</JPEG>

<TIFF userlabel="label2">
  <ele1>%02d.tiff</ele1>
</TIFF>

我试过了。

<xsl:template match="//xmlns:oldNode[contains(//xmlsns:oldNode/root:ele1, '.')]">
  <xsl:element name="{translate(substring-after(//xmlns:ele1, '.'),
               'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

,但只获取文件ext的第一个。例如,如果jpeg是第一个,我会为两个节点都得到。有没有人能提供专业建议,解释为什么这不起作用。

顺便说一句,我也试过这个,但同样的事情发生了:

<xsl:template match="//xmlns:oldNode[contains(//root:ele1, '.jpeg')]">
  <xsl:element name="JPEG">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//xmlns:oldNode[contains(//root:ele1, '.tiff')]">
  <xsl:element name="TIFF">
      <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

推荐答案

第一个问题是匹配的模板

 <xsl:template match="//xmlns:oldNode[contains(//xmlsns:oldNode/root:ele1, '.')]">

尤其是,对于CONTAINS元素,您可能不希望//oldNode位于前面,因为这将开始查找相对于根元素的第一个oldNode。您真正需要的是相对于您当前匹配的元素查找ele1元素

<xsl:template match="//oldNode[contains(ele1, '.')]">

(顺便说一下,我不确定您是指oldNode还是oldEle。我也不确定您的命名空间适合在哪里,所以我没有在这里显示它们)。

第二个问题是xsl:Element,因为您在这里正在做类似的事情

<xsl:element name="{translate(substring-after(//xmlns:ele1, '.'),         
    'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">   

由于子字符串-After中的//,它将拾取相对于XML根元素的第一个ele1,而不是相对于当前元素的那个。您可能需要执行此操作

<xsl:element name="{translate(substring-after(ele1, '.'),         
    'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">  

改用此模板

<xsl:template match="//oldNode[contains(ele1, '.')]">            
    <xsl:element name="{translate(substring-after(//ele1, '.'),            
           'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">            
       <xsl:apply-templates select="@*|node()"/>            
    </xsl:element>            
</xsl:template>   

同样,对于第二组模板,您应该这样做

<xsl:template match="//oldNode[contains(ele1, '.jpeg')]"> 

这篇关于使用子节点子字符串创建新节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆