2017-09-26 87 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> 
相关问题