XSLT:选择同一个

时间:2018-09-27 02:38:00

标签: xml xslt xslt-2.0

  

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吗?

感谢您的帮助。

2 个答案:

答案 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>&#10;</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>&#10;</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">