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