使用子节点子字符串创建新节点 [英] Make new node using sub-node sub-string
本文介绍了使用子节点子字符串创建新节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个如下所示的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屋!
查看全文