XSLT 2.0:查找子字符串的起始和结束索引

时间:2017-03-25 00:46:10

标签: xml xslt xslt-2.0

我采用寄存器的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个字符内,但如果它在那里,它将更接近开头而不是结尾。

1 个答案:

答案 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>
相关问题