我有以下XML结构:
<row>
<item>Controller</item>
</row>
<row>
<item>****************</item>
</row>
<row>
<item>Serial Number</item>
<item>Name</item>
<item>Controller index</item>
<item>Firmware Version</item>
<item> Product Rev.</item>
<item>Mode</item>
<item>Type</item>
<item>ExtName</item>
<item>Comment</item>
</row>
<row>
<item>#0A384D3</item>
<item>="AdventistBolingbrook"</item>
<item>0</item>
<item>="7.0/2.1"</item>
<item>A00</item>
<item>MA 1000 & 2000</item>
<item>Master</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
</row>
<row>
<item>****************</item>
</row>
<row>
<item>Serial Number</item>
<item>Name</item>
<item>Controller Index</item>
<item>Port Index</item>
<item>Slot Index</item>
<item>Firmware Version</item>
<item>Product Rev.</item>
<item>DL Input Power Status</item>
<item>DL Power Interface Type</item>
<item>DL AGC Status</item>
<item>DL AGC Atten. Value</item>
<item>DL DCA Manual Override</item>
<item>DL Power</item>
<item>UL Atten. Value</item>
<item>ExtName</item>
<item>Comment</item>
</row>
<row>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>1</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>6</item>
<item>6</item>
<item>-21</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>7</item>
<item>7</item>
<item>-27</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>1</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>2</item>
<item>2</item>
<item>-22</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>2</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>3</item>
<item>3</item>
<item>-18</item>
<item>0</item>
<item></item>
<item></item>
</row>
我需要将其转换为:
<row>
<item>Controller</item>
<item>#0A384D3</item>
<item>="AdventistBolingbrook"</item>
<item>0</item>
<item>="7.0/2.1"</item>
<item>A00</item>
<item>MA 1000 & 2000</item>
<item>Master</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>1</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>6</item>
<item>6</item>
<item>-21</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>7</item>
<item>7</item>
<item>-27</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>1</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>2</item>
<item>2</item>
<item>-22</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>2</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>3</item>
<item>3</item>
<item>-18</item>
<item>0</item>
<item></item>
<item></item>
</row>
那么这里的规则是什么。。。
- 我只需要保留第一项以
#
开头的行。作为xpath,这表示为//row/item[1][matches(.,"(#)")]/..
- 每当我有一行的第一个项目以
#
开头时,我都需要从紧挨着前一个同级项目的行中复制第一个项目,在前一个同类项目中,第一个项目是以***
开头的
这是一个更图形化的版本。
<row>
<item>Controller</item> <- I need to include this value into each of these
</row> |
<row> |
<item>****************</item> |
</row> |
<row> |
<item>Serial Number</item> |
<item>Name</item> |
<item>Controller index</item> |
<item>Firmware Version</item> |
<item> Product Rev.</item> |
<item>Mode</item> |
<item>Type</item> |
<item>ExtName</item> |
<item>Comment</item> |
</row> /
<row> <- I want to include this row as its first item starts with `#`
<item>#0A384D3</item> |
<item>="AdventistBolingbrook"</item> |
<item>0</item> |
<item>="7.0/2.1"</item> |
<item>A00</item> |
<item>MA 1000 & 2000</item> |
<item>Master</item> |
<item></item> |
<item></item> |
</row> /
<row> <- I want to include this row as its first item starts with `#`
<item>#0A384D3</item>
<item>="AdventistBolingbrook"</item>
<item>0</item>
<item>="7.0/2.1"</item>
<item>A00</item>
<item>MA 1000 & 2000</item>
<item>Master</item>
<item></item>
<item></item>
</row>
给定格式良好的输入,例如:
XML
<rows>
<row>
<item>Controller</item>
</row>
<row>
<item>****************</item>
</row>
<row>
<item>Serial Number</item>
<item>Name</item>
<item>Controller index</item>
<item>Firmware Version</item>
<item> Product Rev.</item>
<item>Mode</item>
<item>Type</item>
<item>ExtName</item>
<item>Comment</item>
</row>
<row>
<item>#0A384D3</item>
<item>="AdventistBolingbrook"</item>
<item>0</item>
<item>="7.0/2.1"</item>
<item>A00</item>
<item>MA 1000 & 2000</item>
<item>Master</item>
<item></item>
<item></item>
</row>
<row>
<item>Base Unit</item>
</row>
<row>
<item>****************</item>
</row>
<row>
<item>Serial Number</item>
<item>Name</item>
<item>Controller Index</item>
<item>Port Index</item>
<item>Slot Index</item>
<item>Firmware Version</item>
<item>Product Rev.</item>
<item>DL Input Power Status</item>
<item>DL Power Interface Type</item>
<item>DL AGC Status</item>
<item>DL AGC Atten. Value</item>
<item>DL DCA Manual Override</item>
<item>DL Power</item>
<item>UL Atten. Value</item>
<item>ExtName</item>
<item>Comment</item>
</row>
<row>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>1</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>6</item>
<item>6</item>
<item>-21</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>7</item>
<item>7</item>
<item>-27</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>1</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>2</item>
<item>2</item>
<item>-22</item>
<item>0</item>
<item></item>
<item></item>
</row>
<row>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>2</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>3</item>
<item>3</item>
<item>-18</item>
<item>0</item>
<item></item>
<item></item>
</row>
</rows>
以下样式表:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/rows">
<xsl:copy>
<xsl:for-each-group select="row" group-starting-with="row[item='****************']">
<xsl:variable name="title-item" select="preceding-sibling::row[1]/item" />
<xsl:for-each select="current-group()[starts-with(item[1], '#')]">
<row>
<xsl:copy-of select="$title-item, *"/>
</row>
</xsl:for-each>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将返回:
结果
<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<item>Controller</item>
<item>#0A384D3</item>
<item>="AdventistBolingbrook"</item>
<item>0</item>
<item>="7.0/2.1"</item>
<item>A00</item>
<item>MA 1000 & 2000</item>
<item>Master</item>
<item/>
<item/>
</row>
<row>
<item>Base Unit</item>
<item>#0A3651B</item>
<item>VZW BU </item>
<item>0</item>
<item>1</item>
<item>1</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>6</item>
<item>6</item>
<item>-21</item>
<item>0</item>
<item/>
<item/>
</row>
<row>
<item>Base Unit</item>
<item>#0A3651B</item>
<item>222VZW BU </item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>="4.1"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>7</item>
<item>7</item>
<item>-27</item>
<item>0</item>
<item/>
<item/>
</row>
<row>
<item>Base Unit</item>
<item>#50772EC</item>
<item> </item>
<item>3330</item>
<item>4</item>
<item>1</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>2</item>
<item>2</item>
<item>-22</item>
<item>0</item>
<item/>
<item/>
</row>
<row>
<item>Base Unit</item>
<item>#50772EC</item>
<item> </item>
<item>0</item>
<item>4</item>
<item>2</item>
<item>="5.3"</item>
<item>N/A </item>
<item>Normal</item>
<item>RIU</item>
<item>OFF</item>
<item>3</item>
<item>3</item>
<item>-18</item>
<item>0</item>
<item/>
<item/>
</row>
</rows>
除了具有根元素、空元素的自关闭和某些字符的编码之外,哪个AFAICT与您的预期输出完全相同。