XSLT将嵌套元素添加到基于现有元素的最后一个节点

用户名

我有以下XML,该XML具有多次出现的“ item”元素,并且将出现一次“ info”元素

<?xml version="1.0" encoding="utf-8" ?>

<root xmlns="http://temo.com/tempe.xsd">


<di>    
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
<item1>test item 1</item1>
<item2>false</item2>
<item3>1</item3>
</info>
</block1>
<block2>
...
</block2>
</section>
</item>
</list>

<option>
...
</option>

</root>

我想将其转换为以下格式,即,如果存在'move'元素,则应在'info'元素的最后位置添加新元素

<item4>
 <item5>1</item5>
</item4>


<?xml version="1.0" encoding="utf-8" ?>

<root xmlns="http://temo.com/tempe.xsd">


<di>    
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
  <item1>test item 1</item1>
  <item2>false</item2>
  <item3>1</item3>
  <item4>
    <item5>1</item5>
  </item4>
</info>
</block1>
  <block2>
    ...
  </block2>
</section>
</item>
<item>
    ...
</item>
</list>
<option>
...
</option>

</root>

我正在使用以下XSLT转换为以上格式

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes" encoding="utf-8"/>

<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/info/*[position()=last()]">
<xsl:copy>
<xsl:choose>
<xsl:when test="/section/block/move">
<!--Add new element item4-->
<xsl:element name="item4">
<xsl:element name="item5">
<xsl:value-of select="section/block/move"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="identity" />
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

您能帮我在XSLT中找到问题吗?我是XSLT的新手

谢谢 :)

马丁·洪恩(Martin Honnen)

您在输入XML上有一个默认的名称空间声明,并且输出XML还需要该名称空间来插入元素,因此您需要

xmlns:tp =“ http://temo.com/tempe.xsd”

xsl:stylesheet根元素上,那么您需要调整路径和模式以使用该前缀,例如,代替info您所需要的tp:info,而不是section/block/move您所需要的tp:section/tp:block/tp:move,依此类推。

XSLT示例中的路径似乎错误,但是您使用的/section/block/move是根元素,root因此/section即使添加了名称空间前缀,根元素也不会选择任何内容。而你的道路有block,输入有block1

我没有尝试修复您的代码,而是编写了新的样式表,它是

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://temo.com/tempe.xsd"
  xmlns:tp="http://temo.com/tempe.xsd"
  exclude-result-prefixes="tp"
  version="1.0">

<xsl:param name="to-insert" xml:space="preserve">
<item4>
 <item5><xsl:value-of select="//tp:section/tp:block1/tp:move"/></item5>
</item4>
</xsl:param>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="tp:item[.//tp:move[. = 1]]//tp:info">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <xsl:copy-of select="$to-insert"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

它输出

<root xmlns="http://temo.com/tempe.xsd">


<di>
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
<item1>test item 1</item1>
<item2>false</item2>
<item3>1</item3>

<item4 xmlns:tp="http://temo.com/tempe.xsd">
 <item5>1</item5>
</item4>
</info>
</block1>
<block2>
...
</block2>
</section>
</item>
</list>

<option>
...
</option>

</root>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB - 将数组的最后一个元素添加到其他字段中的现有数组

将新元素添加到阵列或更新现有的一个(阵营状态)

将节点添加到现有xml元素

从最后一个元素开始按顺序将class添加到元素的集合中

我有一个循环,想用ajax将类添加到最后4个元素中

尝试定义一个将元素添加到现有数组顶部的函数

将转义符(\ n)添加到字符串元组的最后一个元素

将类“ last”添加到while循环中数组的最后一个元素

仅将最后一个元素添加到 Android 中的 RecyclerView (Kotlin)

将CSS添加到最后一个元素

从最后一个元素到第一个元素添加到数组

C:将数组的所有元素添加到另一个元素中

Chrome-将元素添加到* ngFor视图时,始终向下滚动到最后一个元素

将onclick事件添加到仅在最后一个元素上起作用的新html元素

将一个元素添加到多维数组

HtmlTextWriter将一个类添加到已具有一个元素的元素

Javascript将一个元素添加到另一个没有id的元素中

如何基于Python中的上一个元素将新元素添加到列表中?

单击嵌套的子元素时,Javascript将类添加到下一个元素

将for循环结果添加到数组,并在最后一个循环之后显示已添加元素的总和

将节点添加到XElement作为最后一个节点

c++ - 如何将最后一个元素添加到包含数组的结构的向量中

单击时,将类添加到HTML列表中的一个且只有一个元素

如何将ngClick添加到现有元素

将元素添加到现有阵列Bash

将QQuickView元素添加到现有窗口

将新元素添加到现有XML中

Java AWT将元素添加到现有框架

将现有函数添加到 DOM 元素