代码之家  ›  专栏  ›  技术社区  ›  user8674587

将元素添加到节点(如果不存在)

  •  2
  • user8674587  · 技术社区  · 7 年前

    <?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>
    

    我所尝试的是添加element属性,即使它已经存在,因此我在同一个节点中得到了两个element属性,如果它已经存在的话。你能给我一个示例实现吗,我使用的是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>
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Martin Honnen    7 年前

    身份转换可以使用 xsl:mode 然后你只需要添加一个模板匹配 RECORD[not(PROPERTY)]/*[last()] (的最后一个子元素 RECORD s没有a 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>
    
        2
  •  1
  •   Michael Kay    7 年前

    另一种方法是

    <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>