如何使用 XSLT 删除特定前缀

Posted

技术标签:

【中文标题】如何使用 XSLT 删除特定前缀【英文标题】:How to remove a specific prefix using XSLT 【发布时间】:2019-08-28 19:18:25 【问题描述】:

我需要从 RecuperarCopiaResult 节点中删除 ns0: 前缀。

From <ns0:RecuperarCopiaResult> to <RecuperarCopiaResult>

遵循输入 XML

 <?xml version="1.0" encoding="UTF-8"?>
   <ns0:RecuperarCopiaResponse xmlns:ns0="http://tempuri.org/">
    <ns0:RecuperarCopiaResult><![CDATA[<Abastecimento_NF 
    ULTIMO_PONTEIRO="447050"><Abastecimento_NFRow><DT_PROCESS>6/2/2018 
    1:46:08</DT_PROCESS><CD_ABASTECIMENTO>123936138</CD_ABASTECIMENTO>
   <CD_VEICULO>479077</CD_VEICULO><CD_TIPO_REGISTRO>1</CD_TIPO_REGISTRO>
   <NR_BANCO>237</NR_BANCO><CD_REDE>801</CD_REDE><DC_REDE>801</DC_REDE>
   <COD_POSTO>244</COD_POSTO><COD_FROTA>4941</COD_FROTA>
  <COD_SUBFROTA>11264</COD_SUBFROTA><DC_SUBFROTA>R2C</DC_SUBFROTA>
   <CD_COMBUSTIVEL>S</CD_COMBUSTIVEL><DC_COMBUSTIVEL>S</DC_COMBUSTIVEL>
  <NR_UVE></NR_UVE><DC_PLACA>KWG8687</DC_PLACA><NM_MOTORISTA>
   </NM_MOTORISTA><NR_KM_ATUAL>226076</NR_KM_ATUAL>
   <NR_QTD_LITROS>139,55</NR_QTD_LITROS>
   <NR_QTD_LITROS_TOTAL>139,55</NR_QTD_LITROS_TOTAL>
   <CD_STATUS_ABASTECIMENTO>S</CD_STATUS_ABASTECIMENTO>
  </Abastecimento_NFRow></Abastecimento_NF>]]></ns0:RecuperarCopiaResult>
 </ns0:RecuperarCopiaResponse>

我正在使用以下 xslt 代码:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:SOAP-
  ENV="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:ns0="http://tempuri.org/">
  <xsl:output encoding='UTF-8' method="xml" indent="yes" omit-xml-
    declaration="yes" />    
   <xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
   </xsl:template>
 <xsl:template match="SOAP-ENV:*">
  <xsl:apply-templates select="@* | node()"/>
  </xsl:template>
  <xsl:template match="ns0:*">
  <xsl:element name="ns0:local-name()" 
    namespace="http://www.supergasbras.com.br/service/CtfAbastecimento">
     <xsl:apply-templates select="@*|node()"/>
   </xsl:element>
  </xsl:template>
 <xsl:template match="text()">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>

以下是预期的 XML:

  <?xml version="1.0" encoding="UTF-8"?>
   <ns0:RecuperarCopiaResponse 
    xmlns:ns0="http://www.supergasbras.com.br/service/CtfAbastecimento">
  <RecuperarCopiaResult>
   <Abastecimento_NF ULTIMO_PONTEIRO="447050">
     <Abastecimento_NFRow>
        <DT_PROCESS>6/2/2018 1:46:08</DT_PROCESS>
        <CD_ABASTECIMENTO>123936138</CD_ABASTECIMENTO>
        <CD_VEICULO>479077</CD_VEICULO>
        <CD_TIPO_REGISTRO>1</CD_TIPO_REGISTRO>
        <NR_BANCO>237</NR_BANCO>
        <CD_REDE>801</CD_REDE>
        <DC_REDE>801</DC_REDE>
        <COD_POSTO>244</COD_POSTO>
        <COD_FROTA>4941</COD_FROTA>
        <COD_SUBFROTA>11264</COD_SUBFROTA>
        <DC_SUBFROTA>R2C</DC_SUBFROTA>
        <CD_COMBUSTIVEL>S</CD_COMBUSTIVEL>
        <DC_COMBUSTIVEL>S</DC_COMBUSTIVEL>
        <NR_UVE/>
        <DC_PLACA>KWG8687</DC_PLACA>
        <NM_MOTORISTA/>
        <NR_KM_ATUAL>226076</NR_KM_ATUAL>
        <NR_QTD_LITROS>139,55</NR_QTD_LITROS>
        <VL_PRECO_UNITARIO>3,798</VL_PRECO_UNITARIO>
        <VL_PRECO_AEP>3,798</VL_PRECO_AEP>
        <VL_VALOR_TOTAL>530,01</VL_VALOR_TOTAL>
        <DT_EVENTO>5/2/2018 14:37:00</DT_EVENTO>
        <DT_DEBITO>26/2/2018 0:00:00</DT_DEBITO>
        <DT_CREDITO>27/2/2018 0:00:00</DT_CREDITO>
        <NOMEARQ>T2060218.ZZ001305.00244</NOMEARQ>
        <NR_KM_PERCORRIDA>365</NR_KM_PERCORRIDA>
        <NR_QTD_LITROS_TOTAL>139,55</NR_QTD_LITROS_TOTAL>
        <CD_STATUS_ABASTECIMENTO>S</CD_STATUS_ABASTECIMENTO>
     </Abastecimento_NFRow>
   </Abastecimento_NF>
  </RecuperarCopiaResult>
</ns0:RecuperarCopiaResponse>

【问题讨论】:

请将预期的输出添加到您的问题中。 以下是预期的 XML: supergasbras.com.br/service/CtfAbastecimento"> T2060218。 ZZ001305.00244 6/2/2018 1:46:08123936138S 请将预期输出添加到您的问题 预期的 XML 在这里(“以下是预期的 XML:”部分)。我的问题已被编辑。你可以帮帮我吗?问候 【参考方案1】:

您的问题说明了一件事,您的预期结果显示了完全不同的内容。试试这个方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tmp="http://tempuri.org/"
exclude-result-prefixes="tmp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/tmp:RecuperarCopiaResponse">
    <ns0:RecuperarCopiaResponse xmlns:ns0="http://www.supergasbras.com.br/service/CtfAbastecimento">
        <xsl:apply-templates/>
    </ns0:RecuperarCopiaResponse>
</xsl:template>

<xsl:template match="tmp:RecuperarCopiaResult">
    <RecuperarCopiaResult>
        <xsl:value-of select="." disable-output-escaping="yes"/>
    </RecuperarCopiaResult>
</xsl:template>

</xsl:stylesheet>

【讨论】:

好。如果您的问题得到解答,请通过接受答案来关闭它。

以上是关于如何使用 XSLT 删除特定前缀的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:如何删除同义名称空间

使用 XSLT 进行空前缀转换的 XML [重复]

如何在 XSLT 输出中控制名称空间前缀(特别是默认名称空间)?

如何使用 XSLT 从 XML 中删除元素标记

如何使用 XSLT 为所有元素和属性添加名称空间和前缀?

如何将前缀类型添加到重复父节点并使用 XSLT 选择每个元素的所有元素?