簡體   English   中英

XSLT 1.0轉換覆蓋或添加子節點

[英]XSLT 1.0 transformation overwrite or add child nodes

我正在嘗試在以下xml上使用xslt 1.0(使用Visual Studio 2015)轉換。

我得到了房屋的名稱,以及應該在該房屋內的家具的名稱和新值。

如果已經存在具有給定名稱的家具,請覆蓋其值。
如果沒有,請創建一個新的。
如果家具在屋子里但不應該被覆蓋,只需復制它即可。
房屋中已擺放的家具的順序不應更改。

我對c ++,C#,JAVA之類的語言並不陌生,但是xslt是...不同。 盡管這是上述語言中的一項簡單任務,但我在這里確實很努力。

請幫忙。

XML代碼

<Street>
  <House Name="house1">
    <Window>niceView</Window>
    <Furniture Name="name1">value1</Furniture>
    <Furniture Name="name2">value2</Furniture>
    <Furniture Name="name3">value3</Furniture>
    <Furniture Name="name4">value4</Furniture>     
  </House>
  <House>
    <Brick Name="cubrick"></Brick>
    <Furniture name="name1>value</Furniture>
  </House>
</Street>

XSLT開始

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

<xsl:param name="house1" select='house1'/>
<xsl:param name="name2" select='newValue1'/>
<xsl:param name="name4" select='newValue2'/>
<xsl:param name="name10" select='newValue5'/>
...

所需的輸出是:

<Street>
  <House Name="house1">
    <Window>niceView</Window>
    <Furniture Name="name1">value1</Furniture>
    <Furniture Name="name2">newValue1</Furniture>
    <Furniture Name="name3">value3</Furniture>
    <Furniture Name="name4">newValue2</Furniture>  
    <Furniture Name="name10">newValue5</Furniture>   
  </House>
  <House>
    <Brick Name="cubrick"></Brick>
    <Furniture name="name1>value</Furniture>
  </House>
</Street>

根據您的意見,我建議您考慮采用以下方法:

XSLT 1.0

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

<!-- MODIFY THESE AS NECESSARY -->
<xsl:param name="my-house">house1</xsl:param>

<xsl:variable name="my-values">
    <Furniture Name="name2">newValue2</Furniture>
    <Furniture Name="name4">newValue4</Furniture>
    <Furniture Name="name10">newValue10</Furniture>
</xsl:variable>

<!-- DO NOT MODIFY FROM THIS POINT ON -->
<xsl:variable name="user-values" select="exsl:node-set($my-values)/Furniture" />

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

<xsl:template match="House">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:if test="@Name=$my-house">
            <!-- add missing nodes -->
            <xsl:copy-of select="$user-values[not(@Name=current()/Furniture/@Name)]"/>
        </xsl:if>
    </xsl:copy>
</xsl:template>

<xsl:template match="Furniture">
    <xsl:variable name="override" select="$user-values[@Name=current()/@Name]"/>
    <Furniture Name="{@Name}">
        <xsl:choose>
            <xsl:when test="../@Name=$my-house and $override">
                <xsl:value-of select="$override" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="." />
            </xsl:otherwise>
        </xsl:choose>
    </Furniture>
</xsl:template>

</xsl:stylesheet>

當應用於以下格式正確的(!)示例輸入時:

XML格式

<Street>
  <House Name="house1">
    <Window>niceView</Window>
    <Furniture Name="name1">value1</Furniture>
    <Furniture Name="name2">value2</Furniture>
    <Furniture Name="name3">value3</Furniture>
    <Furniture Name="name4">value4</Furniture>     
  </House>
  <House>
    <Brick Name="cubrick"></Brick>
    <Furniture Name="name1">value</Furniture>
  </House>
</Street>

結果將是:

<?xml version="1.0" encoding="UTF-8"?>
<Street>
   <House Name="house1">
      <Window>niceView</Window>
      <Furniture Name="name1">value1</Furniture>
      <Furniture Name="name2">newValue2</Furniture>
      <Furniture Name="name3">value3</Furniture>
      <Furniture Name="name4">newValue4</Furniture>
      <Furniture Name="name10">newValue10</Furniture>
   </House>
   <House>
      <Brick Name="cubrick"/>
      <Furniture Name="name1">value</Furniture>
   </House>
</Street>

暫無
暫無

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

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