首页 > 解决方案 > 在 XSLT 中的该值之前更新连接 ID(更深层次)的现有节点

问题描述

我正在尝试使用 XSLT 来更新现有节点(ItemDescription),并连接 InternalID(更深层次)和现有描述。

原始 XML

<urn:ExternalReqForApprovalImportRequest xmlns:urn="urn:Ariba:Buyer:vrealm_1" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" partition="" variant="">
    <urn:ExternalReqForApprovalInput_Item>
        <urn:item>
            <urn:Name>Line 1</urn:Name>
            <urn:Operation>NEW</urn:Operation>
            <urn:ExternalReqLineItems>
                <urn:item>
                    <urn:ExternalLineNumber>2</urn:ExternalLineNumber>
                    <urn:ItemDescription>TEST DESCRIPTION 1</urn:ItemDescription>
                    <urn:Quantity>1.00</urn:Quantity>
                    <urn:LineExtrinsics>
                        <Extrinsics>
                            <Extrinsic name="InternalID">7000083</Extrinsic>
                        </Extrinsics>
                    </urn:LineExtrinsics>
                </urn:item>
            </urn:ExternalReqLineItems>
        </urn:item>
        <urn:item>
            <urn:Name>Line 2</urn:Name>
            <urn:Operation>NEW</urn:Operation>
            <urn:ExternalReqLineItems>
                <urn:item>
                    <urn:ExternalLineNumber>2</urn:ExternalLineNumber>
                    <urn:ItemDescription>TEST DESCRIPTION 2</urn:ItemDescription>
                    <urn:Quantity>1.00</urn:Quantity>
                    <urn:LineExtrinsics>
                        <Extrinsics>
                            <Extrinsic name="InternalID">7000084</Extrinsic>
                        </Extrinsics>
                    </urn:LineExtrinsics>
                </urn:item>
            </urn:ExternalReqLineItems>
        </urn:item>     
    </urn:ExternalReqForApprovalInput_Item>
</urn:ExternalReqForApprovalImportRequest>

结果应该是这样的:

<urn:ExternalReqForApprovalImportRequest xmlns:urn="urn:Ariba:Buyer:vrealm_1" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" partition="" variant="">
    <urn:ExternalReqForApprovalInput_Item>
        <urn:item>
            <urn:Name>Line 1</urn:Name>
            <urn:Operation>NEW</urn:Operation>
            <urn:ExternalReqLineItems>
                <urn:item>
                    <urn:ExternalLineNumber>2</urn:ExternalLineNumber>
                    <urn:ItemDescription>7000083|TEST DESCRIPTION 1</urn:ItemDescription>
                    <urn:Quantity>1.00</urn:Quantity>
                    <urn:LineExtrinsics>
                    </urn:LineExtrinsics>
                </urn:item>
            </urn:ExternalReqLineItems>
        </urn:item>
        <urn:item>
            <urn:Name>Line 2</urn:Name>
            <urn:Operation>NEW</urn:Operation>
            <urn:ExternalReqLineItems>
                <urn:item>
                    <urn:ExternalLineNumber>2</urn:ExternalLineNumber>
                    <urn:ItemDescription>7000084|TEST DESCRIPTION 2</urn:ItemDescription>
                    <urn:Quantity>1.00</urn:Quantity>
                    <urn:LineExtrinsics>
                    </urn:LineExtrinsics>
                </urn:item>
            </urn:ExternalReqLineItems>
        </urn:item>     
    </urn:ExternalReqForApprovalInput_Item>
</urn:ExternalReqForApprovalImportRequest>

我正在使用 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:p1="urn:Ariba:Buyer:vrealm_1">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

但我错过了如何去 ItemDescription 并连接值,应该怎么做?

谢谢你。

标签: xmlxslt

解决方案


您需要为要修改的每个元素添加一个模板:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:urn="urn:Ariba:Buyer:vrealm_1">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="urn:ItemDescription">
    <xsl:copy>
        <xsl:value-of select="../urn:LineExtrinsics/Extrinsics/Extrinsic[@name='InternalID']"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="."/>
    </xsl:copy>
</xsl:template>

<xsl:template match="urn:LineExtrinsics">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

推荐阅读