gpt4 book ai didi

xml - xPath XSLT获取父元素及其子代和子代

转载 作者:行者123 更新时间:2023-12-03 17:02:24 24 4
gpt4 key购买 nike

我需要帮助来更改这样的xml结构

<AcctInqRq>
<MsgRqHdr>
<RqUID>86eb9644-decf-4fa2-bd16-6d5403a8660a</RqUID>
<ChannelId>897</ChannelId>
</MsgRqHdr>
<InqInfo>
<FromAccount>
<AccountId>11012442</AccountId>
<AccountCurrency/>
</FromAccount>
</InqInfo>
<RefInfo>
<RefName>AppCallerName</RefName>
<RefValue>API_GATEWAY</RefValue>
</RefInfo>
</AcctInqRq>


对此

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://www.some.com/esb/inquiry/acct/types" xmlns:core="http://www.some.com/esb/shared/core">
<soapenv:Header/>
<soapenv:Body>
<typ:AcctInqRq>
<core:MsgRqHdr>
<core:RqUID>86eb9644-decf-4fa2-bd16-6d5403a8660a</core:RqUID>
<core:ChannelId>897</core:ChannelId>
</core:MsgRqHdr>
<typ:InqInfo>
<typ:FromAccount>
<typ:AccountId>11012442</typ:AccountId>
<typ:AccountCurrency/>
</typ:FromAccount>
</typ:InqInfo>
<core:RefInfo>
<core:RefName>AppCallerName</core:RefName>
<core:RefValue>API_GATEWAY</core:RefValue>
</core:RefInfo>
</typ:AcctInqRq>
</soapenv:Body>
</soapenv:Envelope>


这是我当前的xslt

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:typ="http://www.some.com/esb/inquiry/acct/types"
xmlns:core="http://www.some.com/esb/shared/core"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="utf-8"/>
<xsl:template match="/">
<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<xsl:apply-templates/>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
<xsl:template match="AcctInqRq|InqInfo|FromAccount|AccountId|AccountCurrency|ToAccount|AccountId|AccountCurrency|ChequeNo|RetrievalNo|SlipNo">
<xsl:element name="typ:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="MsgRqHdr">
<xsl:for-each select="*">
<xsl:element name="core:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


正如您在尝试手动列出每个单个元素标签之前在第二个模板标签中看到的那样,但这很费时间。所以现在我要检查父元素,并递归更改所有子元素,并分别添加前缀。您可以在第三个模板标签中看到我尝试过的内容。但是它失败了。
那我该怎么办呢?另外请注意,我们可以覆盖某些字段以不遵守上述规则。例如,根节点AccInqRq应该添加前缀typ,但是其后代MsgRqHdr和RefInfo应该添加前缀core。

所以我想这样的事情(CMIIW)

..upper xsl code..
<xsl:template match="MsgRqHdr | RefInfo | *other parent element to be added prefix core*
</xsl:template>

<xsl:template match="InqInfo| *other parent element to be added prefix typ*
</xsl:template>

<xsl:template match=" *probably add this one to override some field with specific prefix typ*
</xsl:template>


谢谢

编辑:
还有另一个信息。父节点的所有子节点都应递归,该节点应具有前缀core,因此不可能在其前缀中输入typ。虽然父元素的每个子节点都具有类型前缀,但是有可能其子节点具有核心前缀。因此,也许我们可以默认为根元素的子代添加前缀类型,然后再指定哪些子代应具有核心前缀

最佳答案

您可以为其他元素编写模板,并确保设置优先级:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:typ="http://www.some.com/esb/inquiry/acct/types"
xmlns:core="http://www.some.com/esb/shared/core"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

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

<xsl:template match="/">
<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<xsl:apply-templates/>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>

<xsl:template match="AcctInqRq | AcctInqRq//*">
<xsl:element name="typ:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

<xsl:template match="MsgRqHdr | MsgRqHdr//* | RefInfo | RefInfo//*" priority="5">
<xsl:element name="core:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

关于xml - xPath XSLT获取父元素及其子代和子代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45858717/

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