gpt4 book ai didi

xml - 使用 XSLT 进行增量循环选择

转载 作者:行者123 更新时间:2023-12-04 04:57:02 25 4
gpt4 key购买 nike

我面临以下问题:

如果我有以下 XML 数据:

<Input>
<Error>
<Info>
<Code> 111 </Code>
<Value>Hello User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>01</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Bye User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>01</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Dead User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>06</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Killed User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>08</Value>
</Info>
</Error>
</Input>

我怎样才能为上述构建一个 XSLT 转换,知道输出应该是这样的
<RecNum>"Value found inside VALUE[2]"</RecNum>
<Error-Description> "Value found inside Value[1]" </Error-Description>

请注意,我的输出并不总是相同的。我可以肯定的是,在每个 Error元素我有 2 Info元素和 2 Value元素每次。

然而,我不知道有多少 Error我在同一个 Value[2] 中的元素, 所以有时我有 3 Error元素,所有这些都带有 2 Info标签,但那三个错误,它们的 Info[2]/Value/text()是一样的。

所以上面输入的输出应该是这样的
<Errors>
<Module>
<RecNum>1 </RecNum>
<Error-Description>Hello user </Error-Description>
<Error-Description>By User </Error-Description>
</Module>
<Module>
<RecNum>6 </RecNum>
<Error-Description> Dead User </Error-Description>
</Module>
<Module>
<RecNum>8 </RecNum>
<Error-Description> Killed User </Error-Description>
</Module>
</Errors>

请注意,我没有 02、03、04、05、07、09 等值...

我只有 01、06 和 08 的值,有时这些值可能不同。如果您愿意,这样的逻辑如何完成?

最佳答案

我建议尽量避免 xsl:for-each支持真正的 XSLT 精神使用模板 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kErrorByVal" match="Error" use="*[2]/Value"/>

<xsl:template match="/*">
<Errors>
<xsl:apply-templates select=
"*[generate-id()=generate-id(key('kErrorByVal',*[2]/Value)[1])]"/>
</Errors>
</xsl:template>

<xsl:template match="Error">
<Module>
<RecNum><xsl:value-of select="*[2]/Value"/></RecNum>
<xsl:apply-templates select="key('kErrorByVal',*[2]/Value)/*[1]/Value"/>
</Module>
</xsl:template>

<xsl:template match="Value">
<Error-Description><xsl:value-of select="."/></Error-Description>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:
<Input>
<Error>
<Info>
<Code> 111 </Code>
<Value>Hello User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>01</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Bye User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>01</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Dead User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>06</Value>
</Info>
</Error>
<Error>
<Info>
<Code> 111 </Code>
<Value>Killed User </Value>
</Info>
<Info>
<Code>118</Code>
<Value>08</Value>
</Info>
</Error>
</Input>

产生了想要的正确结果:
<Errors>
<Module>
<RecNum>01</RecNum>
<Error-Description>Hello User </Error-Description>
<Error-Description>Bye User </Error-Description>
</Module>
<Module>
<RecNum>06</RecNum>
<Error-Description>Dead User </Error-Description>
</Module>
<Module>
<RecNum>08</RecNum>
<Error-Description>Killed User </Error-Description>
</Module>
</Errors>

关于xml - 使用 XSLT 进行增量循环选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com