簡體   English   中英

使用xslt替換xml節點

[英]Replace an xml nodes by using xslt

在這個xml中,我想用另一個節點<message>替換<transfom>節點,但是復制數據。

是否可以使用xslt,我使用xslt 2.0將轉換節點轉換為消息節點,但它僅適用於一個流節點。

<root
    xmlns="http://www.example.com/something">
    <flow>
        <list name="listName"/>
        <router name="router"/>
        <!-- I have some other tags here -->
    </flow>
    <flow>
        <list name="listName"/>
        <console name="console"/>
        <!-- I have some other tags here -->
    </flow>
    <flow>
        <payload name="example"/>
        <transform name="transform">
            <!-- Some DATA here --->
        </transform>
        <!-- I have some other tags here -->
    </flow>
    <flow>
        <payload name="sada"/>
        <transform name="transform1">
            <!-- Some DATA here --->
        </transform>
        <!-- I have some other tags here -->
        <transform name="transform2">
            <!-- Some DATA here --->
        </transform>
    </flow>
</root>

<transform>節點存在於兩個<flow>節點中。 有沒有辦法編寫通用的XSLT,用<message>替換<transform> <message>節點,保持節點的位置和節點內的數據。

我使用了<xsl:for-each><xsl:when>以及xpath表達式,例如previous,following。 但它們只轉換<transform name="transform node"> ,但按原樣復制所有其他xml節點。 請讓我知道如何解決這個問題!


更新

這是我用來轉換xml的樣式表

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <root>
        <xsl:for-each select="flow">
            <xsl:choose>
                <xsl:when test="descendant-or-self::transform">
                    <message>
                        <xsl:attribute name="doc:name">
                            <xsl:value-of
                                        select="//transform/@name" />
                        </xsl:attribute>
                        <ee:message>
                            <ee:set-payload>
                                <xsl:value-of select="payload" />
                            </ee:set-payload>
                        </ee:message>
                    </ee:transform>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each>
    </root>
</xsl:stylesheet>

更新14/04/2019

如何從<root>標簽更改名稱空間? 轉換時我有一堆名稱空間要改變。 怎么做?

轉換設計應該從身份轉換開始(參見https://www.w3.org/TR/xslt20/#element-copy中的 “示例:身份轉換”一節),然后只為您想要的節點添加模板進行改造,在XSLT 3則可以使用聲明身份變換為默認處理<xsl:mode on-no-match="shallow-copy"/> https://www.w3.org/TR/xslt-30 /#built-in-templates-shallow-copy )然后你只需要為transform元素編寫一個模板:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.example.com/something"
    xmlns="http://www.example.com/something"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="flow/transform">
      <message>
          <xsl:apply-templates select="@*, node()"/>
      </message>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/pPzifpw

在XSLT 2中你必須拼寫出來:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.example.com/something"
    xmlns="http://www.example.com/something"
    exclude-result-prefixes="#all"
    version="2.0">

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

  <xsl:template match="flow/transform">
      <message>
          <xsl:apply-templates select="@*, node()"/>
      </message>
  </xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM