[英]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.