【问题标题】:XML: How to recursively combine the text of identical elements in XqueryXML:如何在 Xquery 中递归组合相同元素的文本
【发布时间】:2015-01-24 19:20:00
【问题描述】:

如何使用 Xquery 合并整个文档中相同和重复元素中的所有上下文?

示例文档:

<webMessage xmlns="http://www.website.gov.uk/CM/envelope">
<EnvelopeVersion>2.0</EnvelopeVersion>
<Header>
    <MessageDetails>
        <Class>Web-CT600</Class>
        <Qualifier/>
        <Function/>
    </MessageDetails>
    <SenderDetails>
        <IDAuthentication>
            <SenderID/>
            <Authentication>
                <Method/>
                <Role/>
                <Value/>
            </Authentication>
        </IDAuthentication>
    </SenderDetails>
</Header>
<webTalkDetails>
    <Keys>
        <Key Type="UTR">2274792909</Key>
    </Keys>
    <ChannelRouting>
        <Channel>
            <URI/>
            <Product/>
            <Version/>
        </Channel>
    </ChannelRouting>
</webTalkDetails>
<Body>
    <IRenvelope xmlns="http://www.website.gov.uk/taxation/CT/3">
        <IRheader>
            <Keys>
                <Key Type="UTR">2274792909</Key>
            </Keys>
            <PeriodEnd/>
            <DefaultCurrency/>
            <IRmark Type="generic">n1uS2MiavBsb6YwL82MK</IRmark>
            <Sender/>
        </IRheader>
        <CompanyReturn ReturnType="new">
            <CompanyInformation>
                <CompanyName/>
                <RegistrationNumber/>
                <Reference/>
                <PeriodCovered>
                    <From>2013-01-07</From>
                    <To>2014-01-07</To>
                </PeriodCovered>
            </CompanyInformation>
            <Turnover>
                <Total>45893</Total>
            </Turnover>
            <CompanyCalculation>
                <Income>
                    <TradingAndProfessional>
                        <Profits>95517</Profits>
                        <NetProfits>51276</NetProfits>
                    </TradingAndProfessional>
                </Income>
            </CompanyCalculation>
            <AttachedFiles>
                <Xsubmission>
                    <Accounts>
                        <Instance>
                            <EncodedInlineSubmission> TEXT I WANT TO JOIN</EncodedInlineSubmission>
                        </Instance>
                    </Accounts>
                    <Computations>
                        <Instance>
                            <EncodedInlineSubmission> MORE TEXT I WANT TO JOIN</EncodedInlineSubmission>
                        </Instance>
                    </Computations>
                </Xsubmission>

            </AttachedFiles>
        </CompanyTaxReturn>
    </IRenvelope>
</Body>

因此,在此 XML 中,我想将所有实例中的所有文本组合在一起,并将它们放入一个元素中,这样它就会显示为:

<EncodedInlineSubmission> TEXT I WANT TO JOIN MORE TEXT I WANT TO JOIN</EncodedInlineSubmission>

【问题讨论】:

  • 问题描述过于笼统。到目前为止,您尝试过什么?

标签: html xml xslt xpath xquery


【解决方案1】:

更新:在返回的字符串周围添加了一个元素构造函数。

您可以使用fn:string-join() 将字符串序列与连接字符串连接起来。您需要评估一个 XPath 表达式,该表达式选择您要加入的所有节点,然后检索它们的字符串值。

这是一个例子:

declare namespace env = "http://www.website.gov.uk/CM/envelope";

let $nodes := $doc/env:webMessage/env:Body//env:EncodedInlineSubmission
return element EncodedInlineSubmission { fn:string-join($nodes/fn:string(), " ") }

注意事项:

  • 假设 $doc 绑定到示例文档的文档节点
  • 您可能需要不同的 XPath 表达式
  • 您的样本格式不正确

【讨论】:

  • 但这只会返回连接的文本,而不是元素。
【解决方案2】:

您可以使用所有元素的连接值和元素的先前名称简单地构造一个新元素:

for $x in //*:Xsubmission
let $encoded := $x//*:EncodedInlineSubmission
return element {$encoded[1]/local-name()} {string-join($encoded)}

【讨论】:

  • 嗨,我试过了,但我认为我给出的例子有点过于宽泛了。这是带有虚拟数据的数据结构的示例。我尝试了您的代码,但没有得到任何结果。您对上面更新的部分有什么想法吗?
  • 我确实更新了我的答案。但是,下次请在提问之前花点时间提供有用的 SSCCE。您更新的问题与您原来的问题几乎没有关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2019-01-14
  • 1970-01-01
  • 2022-11-22
  • 2013-05-31
  • 2019-08-13
相关资源
最近更新 更多