簡體   English   中英

使用XSLT如何復制特定的XML子樹

[英]Using XSLT how can I copy a specific XML subtree

我已經找到關於正確使用xsl:copy(XSLT 1.0)的各種答案,但是它們似乎都使用相同的<xsl:template match="@*|node()"> ,對於復制整個文檔來說效果很好。 我正在努力僅匹配要復制其子樹並將其應用模板的特定節點。

例如,給定以下XML文檔:

<MyXML>
  <a>
    <b>c</b>
  </a>
  <d>
    <e>f</e>
  </d>
  <g x="y">
    <foo bar="baz">
      <item name="aname">quux</item>
      <item name="bname">xyzzy</item>
    </foo>
  </g>
</MyXML>

這個樣式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="item[@name='bname']/text()">
    <xsl:value-of select="translate(current(), 'y', 'Y')" />
  </xsl:template>

</xsl:stylesheet>

我想做的是只復制元素foo及其屬性和子節點,同時應用翻譯'y'->'Y'。 我想要的結果是這樣的:

<foo bar="baz">
  <item name="aname">quux</item>
  <item name="bname">xYzzY</item>
</foo>

我認為將<xsl:template match="@*|node()">更改為<xsl:template match="//foo"><xsl:template match="//foo/@*|//foo/node()"> 我一直在猜測其他各種排列,但無法獲得所需的結果。

如果只想處理foo元素,則可以簡單地添加一個與根節點匹配的模板,並將模板僅應用於所需的節點(從而刪除所有其他節點):

XSLT 1.0

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

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

<xsl:template match="/">
    <xsl:apply-templates select="MyXML/g/foo"/>
</xsl:template>

<xsl:template match="item[@name='bname']/text()">
    <xsl:value-of select="translate(., 'y', 'Y')" />
</xsl:template>

</xsl:stylesheet>

請注意,這是假設最多有一個foo元素-否則結果將不是格式正確的XML文檔。

暫無
暫無

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

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