XML输入
<skills>
<skill>
<id>123</id>
<name>Java</name>
</skill>
<skill>
<id>123</id>
<name>Java</name>
<employee>John Doe</employee>
</skill>
</skills>
两者都是技能节点,并且对于 id 和 name 节点始终具有相同的值,但是区别在于其中之一具有额外的文本节点雇员 。 它们可以以任何顺序出现。 第一技能节点将始终存在。在某些情况下,第二技能节点也可能存在。 如果仅存在第一个技能节点,则选择/打印该技能。但是,如果存在具有雇员的技能节点,则选择/打印该技能节点。输出为CSV。
输出
两个
id | name | employee
1 | Java |
或
id | name | employee
1 | Java | John Doe
可以为转换编写xslt吗?
感谢您的帮助。
答案 0 :(得分:0)
目前尚不清楚你在追求什么,所以我猜到了。
请尝试以下操作(我尚未处理换行符)。这不是最漂亮的方法,但是我认为它可以提供您想要的东西。基本上,它只是与所有没有skill
子元素的employee
元素匹配,然后对每个匹配是否有skill
元素与和{{ 1}}子元素,请打印出来。
employee
答案 1 :(得分:0)
听起来像是我的分组问题:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="sep" as="xs:string" select="' | '"/>
<xsl:output method="text"/>
<xsl:template match="skills">
<xsl:value-of select="distinct-values(skill/*/local-name())" separator="{$sep}"/>
<xsl:text> </xsl:text>
<xsl:for-each-group select="skill" composite="yes" group-by="id, name">
<xsl:value-of select="id, name, (current-group()/employee)[1]" separator="{$sep}"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
位于https://xsltfiddle.liberty-development.net/pPqsHTZ的XSLT 3在线示例,如果您仅限使用XSLT 2,请使用<xsl:for-each-group select="skill" group-by="string-join((id, name), $sep)">
而不是<xsl:for-each-group select="skill" composite="yes" group-by="id, name">
。