【发布时间】:2018-05-04 22:27:30
【问题描述】:
使用 XSLT 3.0,
我输入了以下 XML:
<?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>000026672</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>
用于匹配的给定值: (我使用 \t 来定义我的输入文件的制表符分隔性质)
"10355"\t"PL"
"000026672"\t"PL 300 L"
我需要插入到所有没有PROPERTY标签的记录中,值为06
想要的结果:
<?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>000026672</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>
</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>
一直在使用我的真实数据建议的解决方案,(与示例有很大不同),我面临以下问题:
我怎么能有一份报告让我知道,根据输入文件,哪些添加是要完成的,但没有插入?
【问题讨论】:
-
看起来与stackoverflow.com/questions/46419943/… 和stackoverflow.com/questions/46588096/… 非常相似,这两个问题的输入数据和答案都相似。你是在做一个有练习的课程吗?或者这种格式是从哪里来的?
-
我也有这个类似的问题,看过上面的问题和答案,所以我想我会使用这些样本数据。我尝试做的是根据匹配标准在每个节点中添加一个标签,如果它不存在的话。所以一般的问题可能是:我应该如何输入数据以进行匹配?并且我应该使用哪个 xslt,以便向每个节点插入一个带有值的标签,该标签与条件匹配:匹配条件如下:插入一个标签,只有当 TAG A 和 TAG B 等于给定的值时。
-
查看类似的问题和答案,如stackoverflow.com/questions/46345801/…,其中将制表符分隔的数据与输入中的节点进行比较。
-
我使用了上述问题的解决方案,虽然我说要匹配 100 行,但只添加了 88 个标签。有没有办法记录替换日志,以便确切知道发生了什么?
-
根据需要使用
xsl:message输出节点、变量或调试表达式。
标签: xslt-3.0