我采用寄存器的XML文件并注册位数据,其中包括大量复制并将其压缩为压缩符号。为了做到这一点,我需要检测两个或多个寄存器名称何时表明它们实际上是相同的,除了它们的名称。
例如:
<register_block>
<register>
<register_name>FN0_FX_FIDO_FEED_HALT</register_name>
</register>
<register>
<register_name>FN1_FX_FIDO_FEED_HALT</register_name>
</register>
<register>
<register_name>FN2_FX_FIDO_FEED_HALT</register_name>
</register>
.
.
.
<register>
<register_name>FN21_FX_FIDO_FEED_HALT</register_name>
</register>
</register_block>
除了递增数字之外,名称的相同性质表示寄存器重复,因此我可以安全地剥离数字并将寄存器的22次迭代表示为单个压缩寄存器。我使用tokenize()
和[0-9] [0-9] + _作为RegEx去除名称,以便我可以比较它们并构造改革后的名称(减去递增的数字),它主要起作用。
不幸的是,有些寄存器第二次出现[0-9] [0-9] + _模式,例如FN1_SONET_TX1_SQUARE,因为后处理它会把TX1和TX2称为相同的东西。
所以,我需要的是这个:
一种XSLT 2.0方法,用于检测[0-9] [0-9] + _模式及其起始和结束索引的第一次出现,以便我可以确定它是否在寄存器名称的前半部分或者第二,它是2个字符长还是3个。
作为旁注,我不能确定递增的数字是否在名称的前3或4个字符内,但如果它在那里,它将更接近开头而不是结尾。
答案 0 :(得分:0)
我会使用private void Show_Combobox(int iRowIndex, int iColumnIndex)
{
// DESCRIPTION: SHOW THE COMBO BOX IN THE SELECTED CELL OF THE GRID.
// PARAMETERS: iRowIndex - THE ROW ID OF THE GRID.
// iColumnIndex - THE COLUMN ID OF THE GRID.
int x = 0;
int y = 0;
int Width = 0;
int height = 0;
// GET THE ACTIVE CELL'S DIMENTIONS TO BIND THE COMBOBOX WITH IT.
Rectangle rect = default(Rectangle);
rect = dataGridView1.GetCellDisplayRectangle(iColumnIndex, iRowIndex, false);
x = rect.X + dataGridView1.Left;
y = rect.Y + dataGridView1.Top;
Width = rect.Width;
height = rect.Height;
comboBox1.SetBounds(x, y, Width, height);
comboBox1.Visible = true;
comboBox1.Focus();
}
,而不是replace
,如下所示:
tokenize
转换
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="register_block">
<xsl:copy>
<xsl:for-each-group select="register" group-by="replace(register_name, '^(\p{L}+)[0-9]{1,2}', '$1')">
<group name="{current-grouping-key()}">
</group>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:transform>
到
<register_block>
<register>
<register_name>FN0_FX_FIDO_FEED_HALT</register_name>
</register>
<register>
<register_name>FN1_FX_FIDO_FEED_HALT</register_name>
</register>
<register>
<register_name>FN2_FX_FIDO_FEED_HALT</register_name>
</register>
.
.
.
<register>
<register_name>FN21_FX_FIDO_FEED_HALT</register_name>
</register>
<register>
<register_name>FN1_SONET_TX1_SQUARE</register_name>
</register>
<register>
<register_name>FN1_SONET_TX2_SQUARE</register_name>
</register>
</register_block>