首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT替换XML元素值

XSLT替换XML元素值
EN

Stack Overflow用户
提问于 2020-04-04 22:15:46
回答 1查看 789关注 0票数 1

如果第二个元素值不是空的,我将尝试使用XSLT并将xml元素值替换为另一个元素。在下面的示例中,只有在项目标签值存在的情况下,我才需要用ItemMaster-CustomChar10标记值替换项目标记值。

代码语言:javascript
复制
<WmsShippingResultOutSiEs>
    <RecordId>6</RecordId>
    <ShipmentTransactionId>146</ShipmentTransactionId>
    <OutboundOrder>ERIC_1</OutboundOrder>
    <WmsShippingResultLineOutSiEs>
        <Line>
            <RecordId>6</RecordId>
            <ShipmentLineSequence>1</ShipmentLineSequence>
            <Item>BMS9</Item>
            <ItemMaster-CustomChar10>BMS9ALIAS</ItemMaster-CustomChar10>
            <WmsShippingResultLineDetailOutSiEs>
                <Line>
                    <ShipmentLineSequence>1</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>143</ShipmentLineDetailTransactionId>
                </Line>
            </WmsShippingResultLineDetailOutSiEs>
        </Line>
        <Line>
            <RecordId>6</RecordId>
            <ShipmentLineSequence>2</ShipmentLineSequence>
            <Item>BMS10</Item>
            <ItemMaster-CustomChar10/>
            <WmsShippingResultLineDetailOutSiEs>
                <Line>
                    <ShipmentLineSequence>1</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>144</ShipmentLineDetailTransactionId>
                </Line>
                <Line>
                    <ShipmentLineSequence>2</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>145</ShipmentLineDetailTransactionId>
                </Line>
            </WmsShippingResultLineDetailOutSiEs>
        </Line>
    </WmsShippingResultLineOutSiEs>
</WmsShippingResultOutSiEs>

我希望能得到一个像

代码语言:javascript
复制
<WmsShippingResultOutSiEs>
    <RecordId>6</RecordId>
    <ShipmentTransactionId>146</ShipmentTransactionId>
    <OutboundOrder>ERIC_1</OutboundOrder>
    <WmsShippingResultLineOutSiEs>
        <Line>
            <RecordId>6</RecordId>
            <ShipmentLineSequence>1</ShipmentLineSequence>
            <Item>BMS9ALIAS</Item>
            <ItemMaster-CustomChar10>BMS9ALIAS</ItemMaster-CustomChar10>
            <WmsShippingResultLineDetailOutSiEs>
                <Line>
                    <ShipmentLineSequence>1</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>143</ShipmentLineDetailTransactionId>
                </Line>
            </WmsShippingResultLineDetailOutSiEs>
        </Line>
        <Line>
            <RecordId>6</RecordId>
            <ShipmentLineSequence>2</ShipmentLineSequence>
            <Item>BMS10</Item>
            <ItemMaster-CustomChar10/>
            <WmsShippingResultLineDetailOutSiEs>
                <Line>
                    <ShipmentLineSequence>1</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>144</ShipmentLineDetailTransactionId>
                </Line>
                <Line>
                    <ShipmentLineSequence>2</ShipmentLineSequence>
                    <ShipmentLineDetailTransactionId>145</ShipmentLineDetailTransactionId>
                </Line>
            </WmsShippingResultLineDetailOutSiEs>
        </Line>
    </WmsShippingResultLineOutSiEs>
</WmsShippingResultOutSiEs>

所有其他需要的元素都不应该受到影响。可以用递归的方式来做吗?

下面的XSLT代码不起作用

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<!-- identity template -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:for-each select="//WmsShippingResultLineDetailOutSiEs/Lines">
    <xsl:variable name="host_item" select="ItemMaster-CustomChar10"/>
    <xsl:if test="ItemMaster-CustomChar10 !=''">
        <Item>
            <xsl:value-of select="$host_item"/>
        </Item>
    </xsl:if>
</xsl:for-each>

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2020-04-05 07:49:11

与大多数XML到XML转换一样,我建议使用标识转换作为起点,然后为要更改的元素添加一个模板:

代码语言:javascript
复制
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

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

  <xsl:template match="Line[ItemMaster-CustomChar10[normalize-space()]]/Item">
      <xsl:copy>
          <xsl:value-of select="../ItemMaster-CustomChar10"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bEzknsJ

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61035503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档