我需要定义一个xslt,将两个元素与自定义xsd类型的分隔符结合起来

我需要定义一个xslt,将两个元素与自定义xsd类型的分隔符结合起来,xslt,xslt-1.0,xslt-2.0,exslt,Xslt,Xslt 1.0,Xslt 2.0,Exslt,我有两个自定义类型,它们有2个、3个或4个孩子。因此,无论我在哪里得到这些child,我都需要将它们组合成一个元素,即输出XML中的父标记本身。我尝试过,但由于缺乏xslt的经验,所以做不到。有人能帮忙吗 我的输入XML <PERSON> <ID>194</ID> <NAME>IKHAJA</NAME> <DETAILS> <NUMBER>100</NUMBER> &l

我有两个自定义类型,它们有2个、3个或4个孩子。因此,无论我在哪里得到这些child,我都需要将它们组合成一个元素,即输出XML中的父标记本身。我尝试过,但由于缺乏xslt的经验,所以做不到。有人能帮忙吗

我的输入XML

<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应该是这样的:

<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>
如果您在这里看到详细信息、状态、批量等是我的自定义类型,其中包含子节点编号、描述、编号01、编号02。我需要用一个分离器把它们结合起来;如果它们是空的或空的,我就有;;;在“我的目标”列中,如“报告”字段中所示

此外,我还有一些雇主类型的字段,比如带有childs ID、FNAME和LNAME的雇主,我应该将它们组合为ID:FNAME、LNAME,如雇主字段中所示

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


你能帮忙吗?我已经花了一整天的时间在这上面,我需要尽快完成这项工作。

请尝试一下:

<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>
在示例输入上运行时,结果是:

<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>
OP对JLRishe回答的评论:

如果我列出所有的自定义类型,它就可以工作了,但是,在这里,我有很多自定义类型 属于我的自定义类型的字段。而不是列出所有这些 像细节|状态|类型|报告|批量一样,有没有办法 合并这些字段

这很容易做到,因为所有这些可能数百个父元素都有四个子元素中的一个子元素

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

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

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

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

谢谢你的回答。如果我列出了所有的自定义类型,它就会起作用,但是,在这里,我有很多属于自定义类型的字段。除了列出所有细节|状态|类型|报告|批量,还有没有办法合并这些字段。我看不出有什么好办法可以进一步概括它。关于哪些元素需要它们的子元素组合,哪些不需要组合,没有可辨别的模式。顺便说一句,XSLT没有意识到您的XSD,您还没有向我们展示。可能有一种方法可以让XSLT单独加载您的XSD,并让XSLT逻辑交叉引用以获得节点的类型,但这可能比它所值的复杂得多。使用我给出的方法,您还需要列出多少其他元素名称?感谢JLRishe的帮助。Dimitre Novatchev建议对xsl稍加修改对我来说很有用。你可以看看。我对XSL非常陌生,我想我现在有了一些合理的想法。顺便说一句,我的xsd中有将近50-80种类型,它们依赖于6种自定义类型。我没有注意到您想要组合的元素具有相同的子元素集。愚蠢的我没有注意到,但指出这样的细节是有帮助的Deepu413,是的,有一个解决方案根本不需要知道任何父元素名称。感谢Dimitre Novatchev和JLRishe的帮助。上述解决方案对我来说非常有效。这是我在这里的第一篇帖子,我看到了它的帮助。再次感谢。
<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>