2017-09-26 102 views
2

使用XSLT-3,的元素添加到一個節點,如果它亙古不變的存在

我嘗試插入元素屬性,如果它不存在於每個記錄節點:

<?xml ="1.0" encoding="UTF-8"?> 
    <TABLE NAME="TABLE.DB"> 
     <DATA RECORDS="2"> 
      <RECORD ID="1"> 
       <RECNO>1</RECNO> 
       <SEQ>0</SEQ> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10355</ORDER> 
       <CN>PL</CN> 
      </RECORD> 
      <RECORD ID="2"> 
       <RECNO>2</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10356</ORDER> 
       <CN>PL 300 L</CN> 
      </RECORD> 
      <RECORD ID="3"> 
       <RECNO>3</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <NUMBER>10357</NUMBER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>0</PROPERTY> 
      </RECORD> 
     </DATA> 
    </TABLE> 

期望結果:

<?xml ="1.0" encoding="UTF-8"?> 
    <TABLE NAME="TABLE.DB"> 
     <DATA RECORDS="2"> 
      <RECORD ID="1"> 
       <RECNO>1</RECNO> 
       <SEQ>0</SEQ> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10355</ORDER> 
       <CN>PL</CN> 
       <PROPERTY>06</PROPERTY> 
      </RECORD> 
      <RECORD ID="2"> 
       <RECNO>2</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10356</ORDER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>06</PROPERTY> 
      </RECORD> 
      <RECORD ID="3"> 
       <RECNO>3</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <NUMBER>10357</NUMBER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>0</PROPERTY> 
      </RECORD> 
     </DATA> 
    </TABLE> 

什麼,我都試過了,加元素屬性,即使它已經在那裏,所以我結束了兩個元素物業,在同一個節點,如果它已經存在。你能給我一個示例實現,我使用SAXON最新版本(9.8)

編輯: 以下XSL添加一個元素,即使在一個存在:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="xsl exsl xs"> 
    <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//*[local-name() = 'RECORD ID']"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
      <xsl:choose> 
       <xsl:when test="not(PRODUCT)"> 
        <PRODUCT><xsl:value-of select="98"/></PRODUCT> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:copy><xsl:value-of select="98"/></xsl:copy> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

即使在XSLT 1.0聽起來很簡單,寫一個模板'的xsl:模板匹配= 「RECORD [否(PROPERTY)]/* [最後()]」'其中複製該元件和添加新的「PROPERTY」。 –

+0

學習XSLT-3,這就是我爲什麼要求XSLT-3實現的原因,謝謝 – Kedly

+0

在XSLT 1或2或3中,添加節點的方式並沒有什麼不同,在XSLT 3中, '而不是拼出一個標識轉換。試一試,然後解釋我們,如果你沒有得到它的工作,確切地說你卡在哪裏。 –

回答

1

身份轉化可以使用xsl:mode寫入和然後你只需要添加一個模板(沒有PROPERTYRECORD S中的最後一個子元素)匹配RECORD[not(PROPERTY)]/*[last()]該副本是最後一個孩子,並增加了一個新PROPERTY

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

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

    <xsl:param name="new-prop" as="element(PROPERTY)"><PROPERTY>98</PROPERTY></xsl:param> 

    <xsl:template match="RECORD[not(PROPERTY)]/*[last()]"> 
     <xsl:copy-of select="., $new-prop"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

上面的工作就像一個魅力,只是次要的通知,它添加在與前一個元素相同的行 – Kedly

+0

添加''應該給你縮進,可能有助於與''一起完成最一致的結果。 –

+0

非常感謝,補充說,結果是理想的。 – Kedly

0

另一種方法是

<xsl:param name="new-prop" as="element(PROPERTY)"> 
    <PROPERTY>98</PROPERTY> 
</xsl:param> 

<xsl:template match="RECORD"> 
    <RECORD ID="{@ID}"> 
    <xsl:copy-of select="* except PROPERTY, (PROPERTY, $new-prop)[1]"/> 
    </RECORD> 
</xsl:template> 
相關問題