在这里,我粘贴了一个标签名称为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,',',' '),' ')"/>
<xsl:value-of select="substring(substring-before(substring-after($result,' '),' '),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 A
和Sequence 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个标记,但标记可能是A
或D
,因此我需要盲目地定位50f
标记。无论他们提供什么标记,A
或D
50F
之前我需要获取类似的内容50F
我们能够获取以避免位置。
摘要:
@Treemonkey :希望您对我的示例XML有一瞥。它有一些标签,如21A,50F
等。假设我之前有两个字段field1,field2
,那么他们将标记填充为与21A
相同的重复标记,此时我已经将21A
作为字段1标记位置[1]旁边的tag[name = '21A'][1]
21A
)
同样21
旁边标记字段2的位置[2],现在它们将填充A
,但标记与D
或field1
不同。正如我所说sequence A
应该集中field2
而sequence 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
。
答案 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']