的元素添加到一个节点,如果它亘古不变的存在
问题描述:
使用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>
答
身份转化可以使用xsl:mode
写入和然后你只需要添加一个模板(没有PROPERTY
的RECORD
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>
答
另一种方法是
<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>
即使在XSLT 1.0听起来很简单,写一个模板'的xsl:模板匹配= “RECORD [否(PROPERTY)]/* [最后()]”'其中复制该元件和添加新的“PROPERTY”。 –
学习XSLT-3,这就是我为什么要求XSLT-3实现的原因,谢谢 – Kedly
在XSLT 1或2或3中,添加节点的方式并没有什么不同,在XSLT 3中,'而不是拼出一个标识转换。试一试,然后解释我们,如果你没有得到它的工作,确切地说你卡在哪里。 –