首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要定义一个xslt来将一些元素与自定义xsd类型的分隔符组合在一起

我需要定义一个xslt来将一些元素与自定义xsd类型的分隔符组合在一起
EN

Stack Overflow用户
提问于 2013-04-04 23:58:58
回答 2查看 199关注 0票数 1

我有几个自定义类型,其中有2,3或4个孩子。因此,无论我在哪里获得这些childs,我都需要将它们组合成一个元素,即输出XML中的父标记本身。我尝试过,但由于缺乏使用xslt的经验而失败了。任何人都能帮上忙。

我的输入XML。

代码语言:javascript
复制
<PERSON>
  <ID>194</ID>
  <NAME>IKHAJA</NAME>
  <DETAILS>
     <NUMBER>100</NUMBER>
     <Description />
     <NUMBER01 />
     <NUMBER02>Test</NUMBER02>
  </DETAILS>
  <STATUS>
     <NUMBER>ACTIVE</NUMBER>
     <Description>ACTIVE</Description>
     <NUMBER01 />
     <NUMBER02>ACTIVE</NUMBER02>
  </STATUS>
  <employer>
     <ID>123456</ID>
     <FNAME>EMPLOYER F NAME</FNAME>
     <LNAME>EMPLOYER L NAME</LNAME>
  </employer>
  <PERSON_OFF>
     <TYPE>
         <NUMBER>41</NUMBER>
         <Description>AMPLIFIERS</Description>
         <NUMBER01>77</NUMBER01>
         <NUMBER02 />
     </TYPE>
     <REPORT>
         <NUMBER />
         <Description />
         <NUMBER01 />
         <NUMBER02 />
     </REPORT>
     <SERIAL>111</SERIAL>
     <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
     <KEY>5</KEY>
     <CREATED_BY>Test Guy</CREATED_BY>
     <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
     <PERSON_OFF_ONE>
         <BULK>
            <NUMBER>98078</NUMBER>
            <Description>BULK</Description>
            <NUMBER01 />
            <NUMBER02>8563</NUMBER02>
         </BULK>
         <CHECKED>Y</CHECKED>
     </PERSON_OFF_ONE>
  </PERSON_OFF>
</PERSON>

我的输出XML应该是这样的:

代码语言:javascript
复制
<PERSON>
   <ID>194</ID>
   <NAME>IKHAJA</NAME>
   <DETAILS>100;;;Test</DETAILS>
   <STATUS>ACTIVE;ACTIVE;;ACTIVE</STATUS>
   <employer>123456:EMPLOYER F NAME,EMPLOYER L NAME</employer>
   <PERSON_OFF>
       <TYPE>41;AMPLIFIERS;77;</TYPE>
       <REPORT>;;;</REPORT>
       <SERIAL>111</SERIAL>
       <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
       <KEY>5</KEY>
       <CREATED_BY>Test Guy</CREATED_BY>
       <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
       <PERSON_OFF_ONE>
            <BULK>98078;BULK;;8563</BULK>
            <CHECKED>Y</CHECKED>
       </PERSON_OFF_ONE>
   </PERSON_OFF>
</PERSON>

如果你观察到细节,状态,批量等是我的自定义类型,它有子节点NUMBER,Description,NUMBER01,NUMBRER02。我需要将它们与分隔符";“组合在一起,如果它们为空或null,我将在我的目标列中有”;“,如在报告字段中所示。

我还有一些雇主类型的字段,如雇主与孩子的ID,FNAME和LNAME,我应该将它们组合为ID: FNAME,LNAME,如雇主字段中所示。

我认为如果我知道如何处理一个自定义类型,我就可以轻松地处理其他类型。

你能帮帮忙吗?我已经在这上面花了一整天了,我需要尽快做好这件事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-06 11:10:12

OP对JLRishe回答的评论

如果我列出了我所有的自定义类型,它就可以工作,但是,这里有这么多属于我的自定义类型的字段。除了列出“详细信息|状态|类型|报告|批量”之类的所有字段之外,有没有办法合并这些字段。

使用所有这些可能有几百个父元素都有四个子元素之一的事实,可以很容易地做到这一点。

对JLRishe的解决方案进行了细微的调整,可以使用不限数量的父名称:JLRishe

代码语言:javascript
复制
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="*[NUMBER|Description|NUMBER01|NUMBER02]">
            <xsl:copy>
              <xsl:apply-templates select="*" mode="delimit" />
            </xsl:copy>
  </xsl:template>

  <xsl:template match="*[position() > 1]" mode="delimit">
    <xsl:value-of select="concat(';', .)"/>
  </xsl:template>

  <xsl:template match="employer">
    <xsl:copy>
      <xsl:apply-templates select="*" mode="idlist" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ID" mode="idlist">
    <xsl:value-of select="concat(., ':')" />
  </xsl:template>

  <xsl:template match="*[not(self::ID)][position() > 1]" mode="idlist">
    <xsl:value-of select="concat(',', .)" />
  </xsl:template>
</xsl:stylesheet>

如您所见,此转换根本没有提到任何父级名称,如详细信息、状态、类型、报告、批量、...等。

当应用于所提供的XML文档时,会产生所需的正确结果:

代码语言:javascript
复制
<PERSON>
   <ID>194</ID>
   <NAME>IKHAJA</NAME>
   <DETAILS>100;;;Test</DETAILS>
   <STATUS>ACTIVE;ACTIVE;;ACTIVE</STATUS>
   <employer>123456:EMPLOYER F NAME,EMPLOYER L NAME</employer>
   <PERSON_OFF>
      <TYPE>41;AMPLIFIERS;77;</TYPE>
      <REPORT>;;;</REPORT>
      <SERIAL>111</SERIAL>
      <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
      <KEY>5</KEY>
      <CREATED_BY>Test Guy</CREATED_BY>
      <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
      <PERSON_OFF_ONE>
         <BULK>98078;BULK;;8563</BULK>
         <CHECKED>Y</CHECKED>
      </PERSON_OFF_ONE>
   </PERSON_OFF>
</PERSON>
票数 0
EN

Stack Overflow用户

发布于 2013-04-05 00:29:32

请尝试一下:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="DETAILS | STATUS | TYPE | REPORT | BULK">
    <xsl:copy>
      <xsl:apply-templates select="*" mode="delimit" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[position() > 1]" mode="delimit">
    <xsl:value-of select="concat(';', .)"/>
  </xsl:template>

  <xsl:template match="employer">
    <xsl:copy>
      <xsl:apply-templates select="*" mode="idlist" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ID" mode="idlist">
    <xsl:value-of select="concat(., ':')" />
  </xsl:template>

  <xsl:template match="*[not(self::ID)][position() > 1]" mode="idlist">
    <xsl:value-of select="concat(',', .)" />
  </xsl:template>
</xsl:stylesheet>

在样例输入上运行时,结果为:

代码语言:javascript
复制
<PERSON>
  <ID>194</ID>
  <NAME>IKHAJA</NAME>
  <DETAILS>100;;;Test</DETAILS>
  <STATUS>ACTIVE;ACTIVE;;ACTIVE</STATUS>
  <employer>123456:EMPLOYER F NAME,EMPLOYER L NAME</employer>
  <PERSON_OFF>
    <TYPE>41;AMPLIFIERS;77;</TYPE>
    <REPORT>;;;</REPORT>
    <SERIAL>111</SERIAL>
    <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
    <KEY>5</KEY>
    <CREATED_BY>Test Guy</CREATED_BY>
    <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
    <PERSON_OFF_ONE>
      <BULK>98078;BULK;;8563</BULK>
      <CHECKED>Y</CHECKED>
    </PERSON_OFF_ONE>
  </PERSON_OFF>
</PERSON>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15816067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档