【问题标题】:remove child node namespace and copy another node into a variable删除子节点命名空间并将另一个节点复制到变量中
【发布时间】:2014-11-04 23:16:56
【问题描述】:

我正在尝试将 soap:Header 元素的所有子元素复制到一个变量中,并尝试删除 PricingRequest 空命名空间 (xmlns="http://www.ama.net") 并仅输出 xml 的 PricingRequest 部分.我能够删除 PricingRequest 空命名空间并获得正确的输出,但无法将 soap:Header 子元素存储到变量中,是否可以将 soap:Header 的子元素复制到变量中?

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header xmlns="http://www.ama.net/1axml-msg/schema/msg-header-1_0.xsd">
  <MessageHeader ResponseRequested="true" version="1.0" Terminate="true" Reverse="true" id="09B5581A" soap:mustUnderstand="1">
    <From>1ASI</From>
    <To>1ASRINSAIG</To>
    <TimeStamp>
      <GenerationTime>2014-10-22T12:41:38Z</GenerationTime>
    </TimeStamp>    
  </MessageHeader>
</soap:Header>
<soap:Body>
<PricingRequest xmlns="http://www.ama.net">
    <originatorSection>
        <deliverySystem>
            <companyId>1A</companyId>
            <cityCode>MUC</cityCode>
        </deliverySystem>       
    </originatorSection>    
</PricingRequest>
</soap:Body>
</soap:Envelope>

XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.ama.net" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
<!--    <xsl:template match="/*[local-name()='Envelope']">
        <xsl:variable name="SOAPHeader" select="/soap:Header/node()" />
        <xsl:text> MessageHeader INFO:<xsl:copy-of select="$SOAPHeader"/>  </xsl:text>
    </xsl:template>  -->

    <xsl:template match="*">
        <xsl:element name="{name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>      
    </xsl:template>
    <xsl:template match="*[not(ancestor-or-self::x:PricingRequest)]">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

期待 OUTPUT 但无法将 soap:Header 复制到变量中:

<PricingRequest>
  <originatorSection>
    <deliverySystem>
      <companyId>1A</companyId>
      <cityCode>MUC</cityCode>
    </deliverySystem>
  </originatorSection>
</PricingRequest>

【问题讨论】:

  • 您说“复制soap:Header 的子元素”,但您显示的是soap:Body 的后代。
  • 嗨,迈克尔,感谢您调查我的问题。上面的 xslt 能够获得我正在寻找的输出 XML,并且出于日志记录的目的,我需要在soap:Header 中打印所有元素和属性。如果您查看我的 xslt,您可以在注释代码中看到我正在尝试执行的操作。我无法匹配 soap:Header 并将其内容复制到变量中

标签: xslt xslt-1.0


【解决方案1】:

试试;

<xsl:template match="/">
    <xsl:variable name="SOAPHeader" select="/soap:Envelope/soap:Header/node()" />
    <xsl:text>MessageHeader INFO:</xsl:text>
    <xsl:copy-of select="$SOAPHeader"/>  
</xsl:template>

注意

  1. &lt;xsl:text&gt; 不能包含子元素;
  2. 您的版本与 soap:Envelope 有冲突的模板。

【讨论】:

  • 我迈克尔,感谢您提供有关 xsl:text 的信息,我使用了您的代码并重新构建了我最初的问题。我正在尝试转换为没有命名空间的新 XML,可以这样做吗?
  • @sarma 我建议您将问题回滚到原始问题并发布一个新问题(关闭此问题后)。
  • 感谢您的建议,我回滚到原来的问题。
【解决方案2】:

以下代码按我想要的方式工作。我能够在变量中复制 soap:Header 子元素,并在输出中删除 PricingRequest 命名空间

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.ama.net/1axml-msg/schema/msg-header-1_0.xsd"
    xmlns:ns2="http://www.ama.net" exclude-result-prefixes="ns1 ns2 soap">

    <xsl:template match="ns1:* | ns2:*| soap:*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*" />
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="/">
        <xsl:variable name="SOAPHeader">
            <xsl:apply-templates select="/soap:Envelope/soap:Header/node()" />          
        </xsl:variable>         
        <xsl:text>HeaderInfo:</xsl:text>
        <xsl:copy-of select="$SOAPHeader" />
        <xsl:apply-templates select="/soap:Envelope/soap:Body/node()" />    
    </xsl:template>

</xsl:stylesheet>

我得到的输出:

<?xml version="1.0"?>
HeaderInfo:
  <MessageHeader xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ResponseRequested="true" version="1.0" Terminate="true" Reverse="true" id="09B5581A" soap:mustUnderstand="1">
    <From>1ASI</From>
    <To>1ASRINSAIG</To>
    <TimeStamp>
      <GenerationTime>2014-10-22T12:41:38Z</GenerationTime>
    </TimeStamp>    
  </MessageHeader>

<PricingRequest>
    <originatorSection>
        <deliverySystem>
            <companyId>1A</companyId>
            <cityCode>MUC</cityCode>
        </deliverySystem>       
    </originatorSection>    
</PricingRequest>

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多