如何通过定位特定标记来获取其他标记

时间:2011-12-12 13:20:11

标签: xslt xslt-1.0

在这里,我粘贴了一个标签名称为21A,50F,21D,22B的XML样本。

通常,如果我需要获取特定标记,我可以在XSLT中轻松使用下面的逻辑:

<xsl:choose>
    <xsl:when test="tag[name = '21A'] ">
        <xsl:choose>
            <xsl:when test="substring(tag[name = '21A']/value,1,1) = '/'">
                <xsl:variable name="result" select="concat(translate(tag[name = '21A']/value,',',' '),'&#13;')"/>
                <xsl:value-of select="substring(substring-before(substring-after($result,'&#13;'),'&#13;'),1,11)"/>
            </xsl:when>
            <xsl:when test="substring(tag[name = '21A']/value,1,1) != '/'">
                <xsl:value-of select="substring(tag[name = '21A']/value,1,11)"/>
            </xsl:when>
        </xsl:choose>
    </xsl:when>
</xsl:choose>

但此处我的要求为Sequence ASequence B

  • 50F上方填充的代码位于sequence A
  • 50F下方填充的标记位于sequence B

因为我们需要根据使用50F标记来获取标记。任何人都可以提出建议吗?

<local>
    <message>
        <block4>
            <tag>
                <name>21A</name>
                <value>ALW1031</value>
            </tag>
            <tag>
                <name>50F</name>
                <value>TESTING CITI BANK EFT9</value>
            </tag>
            <tag>
                <name>21D</name>
                <value>OUR</value>
            </tag>
            <tag>
                <name>22B</name>
                <value>ipubby</value>
            </tag>
        </block4>
    </message>
</local>

需要输出:

ALW1031,OUR

以前如果假设他们填充21A两次意味着我在调用标记值时使用了[1]和[2]这个位置。现在,他们将重复填充21个标记,但标记可能是AD,因此我需要盲目地定位50f标记。无论他们提供什么标记,AD 50F之前我需要获取类似的内容50F我们能够获取以避免位置。


摘要 @Treemonkey :希望您对我的示例XML有一瞥。它有一些标签,如21A,50F等。假设我之前有两个字段field1,field2,那么他们将标记填充为与21A相同的重复标记,此时我已经将21A作为字段1标记位置[1]旁边的tag[name = '21A'][1] 21A

同样21旁边标记字段2的位置[2],现在它们将填充A,但标记与Dfield1不同。正如我所说sequence A应该集中field2sequence B应该集中为50F所以现在我们不应该为获取的位置而烦恼,我们有像标记{{1}这样的分界在50F被视为sequence A之前填充的任何字段以及50F必须被视为sequence B之后。

所以最后我们需要通过定位50 F来编写为XSLT。如果我想在21A之前的(示例XML)中显示50F字段,那么我们需要在21A标记之前在XSLT中编写逻辑作为选择标记50F以生成数据在字段1和字段2中,我们需要在21D之后获取50F,因此我们需要在21D之后将逻辑写为select 50F

1 个答案:

答案 0 :(得分:0)

您的要求并不十分清楚,但以下表达方式应该有所帮助。

选择其子tag具有特定值的name之前的所有兄弟姐妹:

/*/*/*/tag[name='50F']/preceding-sibling::*

选择以下兄弟姐妹:

/*/*/*/tag[name='50F']/following-sibling::*

只选择前一个元素:

/*/*/*/tag[name='50F']/preceding-sibling::*[1]

选择具有特定值的孩子name的前一个兄弟姐妹:

/*/*/*/tag[name='50F']/preceding-sibling::*[name='21A']

选择以下兄弟姐妹,让孩子name具有特定值:

/*/*/*/tag[name='50F']/following-sibling::*[name='21D']