使用 XLST 转换将 ODK XML 文件导入 MS Access
Importing ODK XML file to MS Access using XLST transformation
我正在尝试将从 ODK 调查生成的 submission.xml 文件导入到 Access 中。我在 MS Access 中使用 'XML import' 函数,需要转换数据,以便将导入到 table 的节点的每个数据集都将包含调查的 ID。
我有一个 XML 调查数据如下所示:
<SoLa_Tu_Insp_2016-03-13 id="SOLA-160313"
instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2"
submissionDate="2016-04-08T02:11:47.600Z"
isComplete="true"
markedAsCompleteDate="2016-04-08T02:13:12.322Z"
xmlns="http://opendatakit.org/submissions">
<start>2016-04-08T23:47:50.615Z</start>
<end>2016-04-08T02:11:30.954Z</end>
<deviceid>353375050176865</deviceid>
<telnr />
<insp>
<objekt>25</objekt>
<objdel>212</objdel>
<objdel-tx>Bronstunneln</objdel-tx>
<datum>2016-04-08</datum>
<sign>MFR RLS</sign>
<anm>8</anm>
</insp>
<skdr>
<skd>
<metod>100</metod>
<ts>
<ts-nr>523</ts-nr>
<ts-typskada>Lucka - Lös - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>35</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>87</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Åtdragning</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>35</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Lös / Övrigt</skd-tx>
<tk>3</tk>
<anm>Luckan håller på att ramla av</anm>
<aktivitet>87</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>675</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx />
<bildskada>1460073108135.jpg</bildskada>
<bildnr />
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>321</ts-nr>
<ts-typskada>f.a. sprutbetong - Läckage - Tak</ts-typskada>
<ts-kdel>6</ts-kdel>
<ts-kelem>665</ts-kelem>
<ts-mtrl>6</ts-mtrl>
<ts-typ>50</ts-typ>
<ts-orsak>129</ts-orsak>
<ts-aktivitet>45</ts-aktivitet>
<ts-enhet>kg</ts-enhet>
<ts-aktivitet-tx>Injektering</ts-aktivitet-tx>
<ts-mangd>5.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>6</kdel>
<kelem>665</kelem>
<mtrl>6</mtrl>
<typ>50</typ>
<orsak>129</orsak>
<skd-tx>Huvudbärverk / Tak ytförstärkning / Fiberarmerad sprutbetong / Läckage / Vatten</skd-tx>
<tk>2</tk>
<anm>3/s</anm>
<aktivitet>45</aktivitet>
<mangd>5</mangd>
<enhet>kg</enhet>
<sekt1>694</sekt1>
<sekt2>694</sekt2>
<lage>CT</lage>
<lage-tx>Kalk, järn,mangan utfälning droppar rikligt</lage-tx>
<bildskada />
<bildnr>4517</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>321</ts-nr>
<ts-typskada>f.a. sprutbetong - Läckage - Tak</ts-typskada>
<ts-kdel>6</ts-kdel>
<ts-kelem>665</ts-kelem>
<ts-mtrl>6</ts-mtrl>
<ts-typ>50</ts-typ>
<ts-orsak>129</ts-orsak>
<ts-aktivitet>45</ts-aktivitet>
<ts-enhet>kg</ts-enhet>
<ts-aktivitet-tx>Injektering</ts-aktivitet-tx>
<ts-mangd />
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>6</kdel>
<kelem>665</kelem>
<mtrl>6</mtrl>
<typ>50</typ>
<orsak>129</orsak>
<skd-tx>Huvudbärverk / Tak ytförstärkning / Fiberarmerad sprutbetong / Läckage / Vatten</skd-tx>
<tk>1</tk>
<anm>Kalk, järn,mangan utfälning</anm>
<aktivitet>45</aktivitet>
<mangd />
<enhet>kg</enhet>
<sekt1>698</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx>8/sek</lage-tx>
<bildskada />
<bildnr>4519-4520</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd />
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>2</tk>
<anm>Går ej skruva saknas 2st skruvar</anm>
<aktivitet>88</aktivitet>
<mangd />
<enhet>st</enhet>
<sekt1>653</sekt1>
<sekt2 />
<lage>HT</lage>
<lage-tx>Nya skruvhål luckan som matchar</lage-tx>
<bildskada />
<bildnr>4523-4521</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>2</tk>
<anm>Luckan behövs passas om</anm>
<aktivitet>88</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>681</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx>TV3 tidigare 2 skruv har sätts men mådet åtgärdas</lage-tx>
<bildskada />
<bildnr>4527</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>3</tk>
<anm />
<aktivitet>88</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>710</sekt1>
<sekt2 />
<lage>HT</lage>
<lage-tx>Nedre skruvhål passar inte</lage-tx>
<bildskada />
<bildnr>4543-4542</bildnr>
</skd>
</skdr>
<ritningar>212B2B01 212B2B02 212B2B03 212B2B04</ritningar>
<skd-antal>6</skd-antal>
<sekt-min>653</sekt-min>
<sekt-max>710</sekt-max>
<tk-min>1</tk-min>
<tk-max>3</tk-max>
<n0:meta xmlns:n0="http://openrosa.org/xforms">
<n0:instanceID>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</n0:instanceID>
<n0:instanceName>SöLä-25-212-2016-04-08-MFR RLS-4ae669a1-7d89-424a-bfab-26d506da0604</n0:instanceName>
</n0:meta>
我想在每个 'skd' 节点添加根元素的 'instanceID' 属性,以便每个 'skd' 节点看起来像:
<skdr>
<skd>
<id>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</id>
<metod>100</metod>
因此我尝试使用此 XSL 文件进行转换,但未按预期工作:
xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//skd">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<ID><xsl-copy-of select="/SoLa_Tu_Insp_2016-03-13/@instanceID"/></ID>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
我使用上面的转换得到的结果是这样的:
<?xml version="1.0" encoding="utf-8"?>
<dataroot>
<SoLa_Tu_Insp_2016-03-13 xmlns="http://opendatakit.org/submissions" id="SOLA-160313" instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2" submissionDate="2016-04-08T02:11:47.600Z" isComplete="true" markedAsCompleteDate="2016-04-08T02:13:12.322Z">
<start>2016-04-08T23:47:50.615Z</start>
<end>2016-04-08T02:11:30.954Z</end>
<deviceid>353375050176865</deviceid>
<telnr/>
<insp>
<objekt>25</objekt>
<objdel>212</objdel>
<objdel-tx>Bronstunneln</objdel-tx>
<datum>2016-04-08</datum>
<sign>MFR RLS</sign>
<anm>8</anm>
</insp>
<skdr>
<skd>
<metod>100</metod>
<ts>
<ts-nr>523</ts-nr>
<ts-typskada>Lucka - Lös - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>35</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>87</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Åtdragning</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
Thers 在每个 'skd' 节点都没有 'instanceID'。我已经在 http://www.freeformatter.com/xpath-tester.html 测试了 XPATH,似乎没问题。
有人知道我做错了什么吗?
您的模板不匹配源XML文档中的skd
元素,因为该元素在命名空间.
试试这个方法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:odk="http://opendatakit.org/submissions"
exclude-result-prefixes="odk">
<xsl:output indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="odk:skd">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<ID xmlns="http://opendatakit.org/submissions">
<xsl:value-of select="/odk:SoLa_Tu_Insp_2016-03-13/@instanceID"/>
</ID>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
补充说明:
- 用
//
开始 匹配模式 是多余的;
xsl-copy-of
不是有效的 XSLT 指令;
- 您的版本
<xsl:apply-templates select="@*|node()"/>
会复制子节点。
我正在尝试将从 ODK 调查生成的 submission.xml 文件导入到 Access 中。我在 MS Access 中使用 'XML import' 函数,需要转换数据,以便将导入到 table 的节点的每个数据集都将包含调查的 ID。
我有一个 XML 调查数据如下所示:
<SoLa_Tu_Insp_2016-03-13 id="SOLA-160313"
instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2"
submissionDate="2016-04-08T02:11:47.600Z"
isComplete="true"
markedAsCompleteDate="2016-04-08T02:13:12.322Z"
xmlns="http://opendatakit.org/submissions">
<start>2016-04-08T23:47:50.615Z</start>
<end>2016-04-08T02:11:30.954Z</end>
<deviceid>353375050176865</deviceid>
<telnr />
<insp>
<objekt>25</objekt>
<objdel>212</objdel>
<objdel-tx>Bronstunneln</objdel-tx>
<datum>2016-04-08</datum>
<sign>MFR RLS</sign>
<anm>8</anm>
</insp>
<skdr>
<skd>
<metod>100</metod>
<ts>
<ts-nr>523</ts-nr>
<ts-typskada>Lucka - Lös - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>35</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>87</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Åtdragning</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>35</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Lös / Övrigt</skd-tx>
<tk>3</tk>
<anm>Luckan håller på att ramla av</anm>
<aktivitet>87</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>675</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx />
<bildskada>1460073108135.jpg</bildskada>
<bildnr />
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>321</ts-nr>
<ts-typskada>f.a. sprutbetong - Läckage - Tak</ts-typskada>
<ts-kdel>6</ts-kdel>
<ts-kelem>665</ts-kelem>
<ts-mtrl>6</ts-mtrl>
<ts-typ>50</ts-typ>
<ts-orsak>129</ts-orsak>
<ts-aktivitet>45</ts-aktivitet>
<ts-enhet>kg</ts-enhet>
<ts-aktivitet-tx>Injektering</ts-aktivitet-tx>
<ts-mangd>5.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>6</kdel>
<kelem>665</kelem>
<mtrl>6</mtrl>
<typ>50</typ>
<orsak>129</orsak>
<skd-tx>Huvudbärverk / Tak ytförstärkning / Fiberarmerad sprutbetong / Läckage / Vatten</skd-tx>
<tk>2</tk>
<anm>3/s</anm>
<aktivitet>45</aktivitet>
<mangd>5</mangd>
<enhet>kg</enhet>
<sekt1>694</sekt1>
<sekt2>694</sekt2>
<lage>CT</lage>
<lage-tx>Kalk, järn,mangan utfälning droppar rikligt</lage-tx>
<bildskada />
<bildnr>4517</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>321</ts-nr>
<ts-typskada>f.a. sprutbetong - Läckage - Tak</ts-typskada>
<ts-kdel>6</ts-kdel>
<ts-kelem>665</ts-kelem>
<ts-mtrl>6</ts-mtrl>
<ts-typ>50</ts-typ>
<ts-orsak>129</ts-orsak>
<ts-aktivitet>45</ts-aktivitet>
<ts-enhet>kg</ts-enhet>
<ts-aktivitet-tx>Injektering</ts-aktivitet-tx>
<ts-mangd />
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>6</kdel>
<kelem>665</kelem>
<mtrl>6</mtrl>
<typ>50</typ>
<orsak>129</orsak>
<skd-tx>Huvudbärverk / Tak ytförstärkning / Fiberarmerad sprutbetong / Läckage / Vatten</skd-tx>
<tk>1</tk>
<anm>Kalk, järn,mangan utfälning</anm>
<aktivitet>45</aktivitet>
<mangd />
<enhet>kg</enhet>
<sekt1>698</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx>8/sek</lage-tx>
<bildskada />
<bildnr>4519-4520</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd />
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>2</tk>
<anm>Går ej skruva saknas 2st skruvar</anm>
<aktivitet>88</aktivitet>
<mangd />
<enhet>st</enhet>
<sekt1>653</sekt1>
<sekt2 />
<lage>HT</lage>
<lage-tx>Nya skruvhål luckan som matchar</lage-tx>
<bildskada />
<bildnr>4523-4521</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>2</tk>
<anm>Luckan behövs passas om</anm>
<aktivitet>88</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>681</sekt1>
<sekt2 />
<lage>VT</lage>
<lage-tx>TV3 tidigare 2 skruv har sätts men mådet åtgärdas</lage-tx>
<bildskada />
<bildnr>4527</bildnr>
</skd>
<skd>
<metod>100</metod>
<ts>
<ts-nr>513</ts-nr>
<ts-typskada>Lucka - Defekt - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>48</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>88</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Översyn</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
<ovr>
<ovr-kdel />
<ovr-kdel-tx />
<ovr-kelem />
<ovr-kelem-tx />
<ovr-mtrl />
<ovr-mtrl-tx />
<ovr-typ />
<ovr-typ-tx />
<ovr-orsak />
<ovr-aktivitet />
<ovr-aktivitet-tx />
<ovr-enhet />
<ovr-mangd />
</ovr>
<kdel>15</kdel>
<kelem>1530</kelem>
<mtrl>13</mtrl>
<typ>48</typ>
<orsak>999</orsak>
<skd-tx>Gång/inspektionsbrygga etc / Lucka/dörr / Rostfritt stål / Defekt / Övrigt</skd-tx>
<tk>3</tk>
<anm />
<aktivitet>88</aktivitet>
<mangd>1</mangd>
<enhet>st</enhet>
<sekt1>710</sekt1>
<sekt2 />
<lage>HT</lage>
<lage-tx>Nedre skruvhål passar inte</lage-tx>
<bildskada />
<bildnr>4543-4542</bildnr>
</skd>
</skdr>
<ritningar>212B2B01 212B2B02 212B2B03 212B2B04</ritningar>
<skd-antal>6</skd-antal>
<sekt-min>653</sekt-min>
<sekt-max>710</sekt-max>
<tk-min>1</tk-min>
<tk-max>3</tk-max>
<n0:meta xmlns:n0="http://openrosa.org/xforms">
<n0:instanceID>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</n0:instanceID>
<n0:instanceName>SöLä-25-212-2016-04-08-MFR RLS-4ae669a1-7d89-424a-bfab-26d506da0604</n0:instanceName>
</n0:meta>
我想在每个 'skd' 节点添加根元素的 'instanceID' 属性,以便每个 'skd' 节点看起来像:
<skdr>
<skd>
<id>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</id>
<metod>100</metod>
因此我尝试使用此 XSL 文件进行转换,但未按预期工作:
xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//skd">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<ID><xsl-copy-of select="/SoLa_Tu_Insp_2016-03-13/@instanceID"/></ID>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
我使用上面的转换得到的结果是这样的:
<?xml version="1.0" encoding="utf-8"?>
<dataroot>
<SoLa_Tu_Insp_2016-03-13 xmlns="http://opendatakit.org/submissions" id="SOLA-160313" instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2" submissionDate="2016-04-08T02:11:47.600Z" isComplete="true" markedAsCompleteDate="2016-04-08T02:13:12.322Z">
<start>2016-04-08T23:47:50.615Z</start>
<end>2016-04-08T02:11:30.954Z</end>
<deviceid>353375050176865</deviceid>
<telnr/>
<insp>
<objekt>25</objekt>
<objdel>212</objdel>
<objdel-tx>Bronstunneln</objdel-tx>
<datum>2016-04-08</datum>
<sign>MFR RLS</sign>
<anm>8</anm>
</insp>
<skdr>
<skd>
<metod>100</metod>
<ts>
<ts-nr>523</ts-nr>
<ts-typskada>Lucka - Lös - Takelement</ts-typskada>
<ts-kdel>15</ts-kdel>
<ts-kelem>1530</ts-kelem>
<ts-mtrl>13</ts-mtrl>
<ts-typ>35</ts-typ>
<ts-orsak>999</ts-orsak>
<ts-aktivitet>87</ts-aktivitet>
<ts-enhet>st</ts-enhet>
<ts-aktivitet-tx>Åtdragning</ts-aktivitet-tx>
<ts-mangd>1.0000000000</ts-mangd>
</ts>
Thers 在每个 'skd' 节点都没有 'instanceID'。我已经在 http://www.freeformatter.com/xpath-tester.html 测试了 XPATH,似乎没问题。
有人知道我做错了什么吗?
您的模板不匹配源XML文档中的skd
元素,因为该元素在命名空间.
试试这个方法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:odk="http://opendatakit.org/submissions"
exclude-result-prefixes="odk">
<xsl:output indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="odk:skd">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<ID xmlns="http://opendatakit.org/submissions">
<xsl:value-of select="/odk:SoLa_Tu_Insp_2016-03-13/@instanceID"/>
</ID>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
补充说明:
- 用
//
开始 匹配模式 是多余的; xsl-copy-of
不是有效的 XSLT 指令;- 您的版本
<xsl:apply-templates select="@*|node()"/>
会复制子节点。