我想在新父级下嵌套某些元素,但仅限于某些id
值。一旦它们嵌套,它们就不能再重复了。
来源:
<root name="root 1">
<elem id="java" value="val1"/>
<elem id="python" value="val2"/>
<elem id="chair" value="val3"/>
</root>
通缉结果:
<root name="root 1">
<container name="lang">
<elem id="java" value="val1"/>
<elem id="python" value="val2"/>
</container>
<elem id="chair" value="val3"/>
</root>
额外捕获:可能并非所有嵌套目标都可用。然而,它们应该用空值嵌套。
来源:
<root name="root 1">
<elem id="java" value="val1"/>
<elem id="chair" value="val3"/>
</root>
目标:
<root name="root 1">
<container name="lang">
<elem id="java" value="val1"/>
<elem id="python" value=""/>
</container>
<elem id="chair" value="val3"/>
</root>
我的结果不断重复container
。我该如何按预期进行转换?
答案 0 :(得分:0)
您可以在XSLT 2.0中循环遍历字符串列表。所以这可能会起到作用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:variable name="elems" select="elem"/>
<container>
<xsl:for-each select="('java', 'python')">
<elem id="{.}" value="{string($elems[@id=current()]/@value)}"/>
</xsl:for-each>
</container>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="elem[@id=('java', 'python')]"/>
</xsl:stylesheet>