【问题标题】:XML-XSLT Avoid Duplicate then combineXML-XSLT 避免重复然后合并
【发布时间】:2015-10-31 14:22:06
【问题描述】:

当已经有一个 ID 转换时,我无法停止 XSLT 转换。我已经有了想法,一旦转换避免重复,如何组合缺失的部分。

任何帮助将不胜感激,谢谢!

我的 XML 文件

   ?xml version="1.0" encoding="UTF-8"?>
<row>
    <data>
        <id>1</id>
        <fname>Vcut</fname>
        <lname>Piatos</lname>
        <age>0</age>
        <code>1002</code>
        <hobby>dota</hobby>
    </data>
    <data>
        <id>1</id>
        <fname>Mayo</fname>
        <lname>Naise</lname>
        <age>22</age>
        <code>1003</code>
        <hobby>program</hobby>
    </data>
 <data>
        <id>2</id>
        <fname>Ben</fname>
        <lname>Ten</lname>
        <age>22</age>
        <code>1003</code>
        <hobby>Eat</hobby>
    </data>
</row>

XSLT 翻译

    <?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="xs" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">

 <xsl:for-each select="row/data">
<EmployeeID>
<xsl:for-each-group select="id" group-by="id">
 <xsl:value-of select="current-grouping-key()"/>
</xsl:for-each-group>
    </EmployeeID>
         <EmployeeName>
         <xsl:value-of select='concat(fname," ",lname)' />
        </EmployeeName>
      <EmployeeAge>
            <xsl:value-of select='age'/>
    </EmployeeAge>
      <EmployeeCode><xsl:value-of select="code"/></EmployeeCode>
      <EmployeeActivity><xsl:value-of select="hobby"/></EmployeeActivity>
   ------------------------------------------------------------------------
</xsl:for-each>

</xsl:template>


</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<EmployeeID>1</EmployeeID>
<EmployeeName>Vcut Piatos</EmployeeName>
<EmployeeAge>0</EmployeeAge>
<EmployeeCode>1002</EmployeeCode>
<EmployeeActivity>dota</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID/>
<EmployeeName>Mayo Naise</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>program</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID>2</EmployeeID>
<EmployeeName>Ben Ten</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>Eat</EmployeeActivity>
   ------------------------------------------------------------------------

期望的输出

<?xml version="1.0" encoding="UTF-8"?>
<EmployeeID>1</EmployeeID>
<EmployeeName>Vcut Piatos</EmployeeName>
<EmployeeAge>0</EmployeeAge>
<EmployeeCode>1002</EmployeeCode>
<EmployeeActivity>dota</EmployeeActivity>
<EmployeeActivity>program</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID>2</EmployeeID>
<EmployeeName>Ben Ten</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>Eat</EmployeeActivity>
   ------------------------------------------------------------------------

【问题讨论】:

标签: xml xslt


【解决方案1】:

您需要将data 分组为id,而不是id 分组为id - 您需要在row 的上下文中执行此操作,而不是从data 的上下文:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="/row">
    <xsl:for-each-group select="data" group-by="id">
        <EmployeeID>
            <xsl:value-of select="current-grouping-key()"/>
        </EmployeeID>
        <EmployeeName>
            <xsl:value-of select='concat(fname," ",lname)' />
        </EmployeeName>
        <EmployeeAge>
            <xsl:value-of select='age'/>
        </EmployeeAge>
        <EmployeeCode>
            <xsl:value-of select="code"/>
        </EmployeeCode>
        <EmployeeActivity>
            <xsl:value-of select="hobby"/>
        </EmployeeActivity>
------------------------------------------------------------------------
    </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>

注意

  1. 结果不是格式良好的 XML,因为它没有单个根元素;
  2. 文本分隔符可能对人类读者有帮助,但可能会成为进一步处理的障碍 - 请考虑改用注释;
  3. 得到的结果与你发布的不同:第一个员工的活动是data,而不是program

【讨论】:

  • 抱歉,转换数据中没有显示评论。你做得很好,这是我想要的输出,我会处理其他情况。非常感谢您的帮助。
猜你喜欢
  • 2018-10-14
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多