【问题标题】:Move an XML element from its place, to under another parent element using xslt使用 xslt 将 XML 元素从其位置移动到另一个父元素下
【发布时间】:2017-06-13 22:50:46
【问题描述】:

我正在尝试移动 xml 元素的位置,并让它环绕未来父级下的所有其他元素。

输入:

<soap:Body>
  <pre:getResponse>
           <![CDATA[
               <pre:Request>
        .......
               </pre:Request>
    ]]>
</pre:getResponse>

所需的输出:

 <soap:Body>
  <pre:getResponse>
    <pre:Request>
       <![CDATA[

        .......

        ]]>
    </pre:Request>
</pre:getResponse>

请参阅下面的 sn-p。在这里,我向 xml 添加了一个 cdata 标记,它很好地包裹了其他元素。只是这次我想做类似的事情,标签已经在 xml 中:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pre="
[Insert namespace]" version="1.0" >
<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template match="pre:Request">
  <xsl:copy>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:copy-of select="*"/>    
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 请发帖minimal reproducible example。 -- 请注意,不解析 CDATA 部分。 IOW,您的输入 XML sn-p 中没有 pre:Request 元素。

标签: xml xslt


【解决方案1】:

正如我在对您的问题的评论中提到的,您的输入 XML sn-p 中没有 pre:Request 元素,因此它不能被“移动”。整个 CDATA 部分只是一个无意义的字符串,不包含任何标记。

您可以尝试通过字符串操作删除不需要的部分:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pre="http://example.com/pre">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="pre:Request"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="pre:getResponse">
    <xsl:copy>
        <pre:Request>
            <xsl:value-of select="substring-before(substring-after(., '&lt;pre:Request>'), '&lt;/pre:Request>')"/>
        </pre:Request>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

给定一个格式良好的输入,例如:

XML

<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope/">
   <pre:getResponse xmlns:pre="http://example.com/pre">
      <![CDATA[
         <pre:Request>
            <payload>
               <item id="1">001</item>
               <item id="2">002</item>
               <item id="3">003</item>
            </payload>
         </pre:Request>
      ]]>
   </pre:getResponse>
</soap:Body>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope/">
  <pre:getResponse xmlns:pre="http://example.com/pre">
    <pre:Request><![CDATA[
            <payload>
               <item id="1">001</item>
               <item id="2">002</item>
               <item id="3">003</item>
            </payload>
         ]]></pre:Request>
  </pre:getResponse>
</soap:Body>

但是,如果 CDATA 部分在外部“包装器”中包含另一个 &lt;/pre:Request&gt; 字符串,这很容易失败。这里的教训是,如果您需要处理响应,请不要将其作为 CDATA 发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2017-10-19
    • 2013-06-28
    • 2012-06-09
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多