XSLT将节点移动到列表中
本文关键字:列表 移动 节点 XSLT | 更新日期: 2023-09-27 18:26:32
我是Xslt的新手,有以下问题
<root>
<parentnode>
<childnode1>value1</childnode1>
<childnode2>value2</childnode2>
<childnode3>value3</childnode3>
<childnode4>value4</childnode4>
<childnodelist>
</childnodelist>
</parentnode>
</root>
我想要的输出:
如果childnode3或childnode4中有一个值,我需要将该值移动到childnodelist节点中,然后删除原始节点,使其显示如下:
<root>
<ParentNode>
<childnode1>value1</childnode1>
<childnode2>value2</childnode1>
<childnodelist>
<Value name="childnode3">value3</Value>
<Value name="childnode4">Value4</Value>
</childnodelist>
</parentnode>
</root>
我当前的xslt有以下代码,但我不确定如何测试节点中是否有值,如果有,如何创建新节点。我想尽量避免使用"xsl:if",因为我已经读到这不是最佳实践。
<?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"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<xsl:if test="CommercialDataOutput'StructuralVariable'Spare1">
<!--Unsure what do do here-->
<xsl:template match='childnode3|childnode4'/>
我认为您只需要
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="parentNode[normalize-space(foo) or normalize-space(bar)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()[not(self::foo | self::bar)]"/>
<list>
<xsl:apply-templates select="foo | bar" mode="wrap"/>
</list>
</xsl:copy>
</xsl:template>
<xsl:template match="foo | bar" mode="wrap">
<value name="{local-name()}">
<xsl:apply-templates/>
</value>
</xsl:template>
其中foo
和bar
是要检查和转换的元素(如果有内容)。
解决此问题的一种方法是覆盖如下身份模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="childnodelist[not('' = (../childnode3|../childnode4))]">
<xsl:copy>
<xsl:copy-of select="../childnode3|../childnode4"/>
</xsl:copy>
</xsl:template>
<xsl:template match="childnode3[. != '']" />
<xsl:template match="childnode4[. != '']" />
</xsl:stylesheet>
您(消毒)输入样本的结果:
<root>
<parentnode>
<childnode1>value1</childnode1>
<childnode2>value2</childnode2>
<childnodelist>
<childnode3>value3</childnode3>
<childnode4>value4</childnode4>
</childnodelist>
</parentnode>
</root>