Изменение в корневом узле - PullRequest
       3

Изменение в корневом узле

2 голосов
/ 12 октября 2011

Старый ввод xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SalesOrder>
    <SalesOrderHeader>
        <OrderNumber>
            <BuyerOrderNumber>3016</BuyerOrderNumber>
        </OrderNumber>
    </SalesOrderHeader>
    <SalesOrderDetail>
        <ListOfItemDetail>
            <ItemDetail>
                <BaseItemDetail>
                    <LineItemNum>
                        <BuyerLineItemNum>00001</BuyerLineItemNum>
                    </LineItemNum>
                </BaseItemDetail>
            </ItemDetail>
            <ItemDetail>
                <BaseItemDetail>
                    <LineItemNum>
                        <BuyerLineItemNum>00002</BuyerLineItemNum>
                    </LineItemNum>
                </BaseItemDetail>
            </ItemDetail>
        </ListOfItemDetail>
    </SalesOrderDetail>
</SalesOrder>

Старый код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/SalesOrder">
        <ns0:Z_SALES_ORDER xmlns:ns0="urn:sap-com:document:sap:rfc:functions" >
            <SHEADER>
                <xsl:call-template name="sHeader"/>
            </SHEADER>
            <SITEM>
                <xsl:call-template name="sItem"/>
            </SITEM>
    </ns0:Z_SALES_ORDER>
    </xsl:template>
    <xsl:template name="sHeader">
        <SNUMBER>
            <xsl:value-of select="SalesOrderHeader/OrderNumber/BuyerOrderNumber "/>
        </SNUMBER>
    </xsl:template>
    <xsl:template name="sItem">
        <xsl:for-each select="descendant::ItemDetail">
            <item>
                <B_ITEM>
                    <xsl:value-of select="BaseItemDetail/LineItemNum/BuyerLineItemNum"/>
                </B_ITEM>
                </item>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Требуемый вывод:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Z_SALES_ORDER xmlns:ns0="urn:sap-com:document:sap:rfc:functions">
    <SHEADER>
        <SNUMBER>3016</SNUMBER>
    </SHEADER>
    <SITEM>
        <item>
            <B_ITEM>00001</B_ITEM>
        </item>
        <item>
            <B_ITEM>00002</B_ITEM>
        </item>
    </SITEM>
</ns0:Z_SALES_ORDER>

Запрос: теперь есть некоторые изменения в исходном xml. В SalesOrder rootnode они также передают другую информацию. Входной файл ниже.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SalesOrder xmlns="abc:org.xcbl:schemas/xcbl/v4/xcbl4.xsd" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding">
    <SalesOrderHeader>
        <OrderNumber>
            <BuyerOrderNumber>3016</BuyerOrderNumber>
        </OrderNumber>
    </SalesOrderHeader>
    <SalesOrderDetail>
        <ListOfItemDetail>
            <ItemDetail>
                <BaseItemDetail>
                    <LineItemNum>
                        <BuyerLineItemNum>00001</BuyerLineItemNum>
                    </LineItemNum>
                </BaseItemDetail>
            </ItemDetail>
            <ItemDetail>
                <BaseItemDetail>
                    <LineItemNum>
                        <BuyerLineItemNum>00002</BuyerLineItemNum>
                    </LineItemNum>
                </BaseItemDetail>
            </ItemDetail>
        </ListOfItemDetail>
    </SalesOrderDetail>
</SalesOrder>

Не могли бы вы сказать мне, как получить тот же вывод, который я получал, используя старый входной XML-файл.

EDIT Запрос: В корневом узле SalesOrder они также передают другую информацию. Входной файл ниже. Как получить информацию о корневом узле с помощью XSLT?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SalesOrder xmlns="abc:org.xcbl:schemas/xcbl/v4/xcbl4.xsd" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding">
    <SalesOrderHeader>
        <OrderNumber>
            <BuyerOrderNumber>3016</BuyerOrderNumber>
        </OrderNumber>
    </SalesOrderHeader>
</SalesOrder>

1 Ответ

1 голос
/ 12 октября 2011

Теперь, когда у нового XML есть пространство имен, вам нужно квалифицировать ваш xpath с этим пространством имен.Проще всего использовать псевдоним:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:abc="abc:org.xcbl:schemas/xcbl/v4/xcbl4.xsd"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                exclude-result-prefixes="abc xsl"
                >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/abc:SalesOrder">
        <ns0:Z_SALES_ORDER xmlns:ns0="urn:sap-com:document:sap:rfc:functions" >
            <SHEADER>
                <xsl:call-template name="sHeader"/>
            </SHEADER>
            <SITEM>
                <xsl:call-template name="sItem"/>
            </SITEM>
        </ns0:Z_SALES_ORDER>
    </xsl:template>
    <xsl:template name="sHeader">
        <SNUMBER>
            <xsl:value-of select="abc:SalesOrderHeader/abc:OrderNumber/abc:BuyerOrderNumber "/>
        </SNUMBER>
    </xsl:template>
    <xsl:template name="sItem">
        <xsl:for-each select="descendant::abc:ItemDetail">
            <item>
                <B_ITEM>
                    <xsl:value-of select="abc:BaseItemDetail/abc:LineItemNum/abc:BuyerLineItemNum"/>
                </B_ITEM>
            </item>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Редактировать (Сара)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:abc="abc:org.xcbl:schemas/xcbl/v4/xcbl4.xsd" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="abc xsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/abc:SalesOrder">
    <ns0:Z_SALES_ORDER xmlns:ns0="urn:sap-com:document:sap:rfc:functions">
     <SNUMBER>
      <xsl:value-of select="abc:SalesOrderHeader/abc:OrderNumber/abc:BuyerOrderNumber "/>
     </SNUMBER>
    </ns0:Z_SALES_ORDER>
  </xsl:template>
</xsl:stylesheet>
...