我有以下问题。我需要知道是否在x个同名的子节点中的任何一个上满足条件,并且不处理该行。我将xml解析为文本文件,但它可能有2个或3个相同的子节点,它们被称为相同的不同值,如果其中一个符合条件,则处理该行。
这是我的XML的一部分:
<home>
<app>
<data>
<rec>
<rpos>1</rpos>
<itemdef>
<item>HLK-TEST-A</item>
<desc>SOMETHING1</desc>
<ics>
<code>HKU</code>
<bpid></bpid>
<citem>TEST-A</citem>
</ics>
<ics>
<code>HLK</code>
<bpid></bpid>
<citem>TEST-A</citem>
</ics>
</itemdef>
</rec>
<rec>
<rpos>2</rpos>
<itemdef>
<item>HLK-TEST-B</item>
<desc>Test</desc>
<ics>
<code>HKU</code>
<bpid></bpid>
<citem>TEST-B</citem>
</ics>
</itemdef>
</rec>
<rec>
<rpos>3</rpos>
<itemdef>
<item>HLK-TEST-C</item>
<desc>Test3</desc>
<ics>
<code>HLK</code>
<bpid></bpid>
<citem>TEST-C</citem>
</ics>
</itemdef>
</rec>
<rec>
<rpos>4</rpos>
<itemdef>
<item>HLK-TEST-D</item>
<desc>SOMETHING4</desc>
<ics>
<code>HLK</code>
<bpid></bpid>
<citem>TEST-D</citem>
</ics>
<ics>
<code>HKU</code>
<bpid></bpid>
<citem>TEST-D</citem>
</ics>
</itemdef>
</rec>
</data>
</app>
</home>
基本上记录1,3和4必须处理,因为他们有一个&#34;代码&#34;标签的值为HLK
这是我在XSLT上的内容......虽然我可以设法只获得第1和第3条记录......你能帮忙吗?
XSL:
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="home/app/data/rec[itemdef/ics[position() = last()]/code[not(starts-with(.,'HLK'))]]">
</xsl:template>
<xsl:template match="home">
<xsl:apply-templates select="app"/>
</xsl:template>
<xsl:template match="app">
<xsl:apply-templates select="data"/>
</xsl:template>
<xsl:template match="app" mode="print">
<xsl:text>105604|</xsl:text>
<xsl:value-of select='date'/>
<xsl:text>T</xsl:text>
<xsl:value-of select='time'/>
<xsl:text>|</xsl:text>
</xsl:template>
<xsl:template match="data">
<xsl:apply-templates select="rec"/>
</xsl:template>
<xsl:template match="rec">
<xsl:apply-templates select="itemdef"/>
</xsl:template>
<xsl:template match="itemdef">
<xsl:apply-templates select="ancestor::app" mode="print"/>
<xsl:value-of select='item'/><xsl:text>|</xsl:text>
<xsl:value-of select='desc'/><xsl:text>|</xsl:text>
<xsl:text>|</xsl:text>
<xsl:text>|
</xsl:text>
</xsl:template>
</xsl:stylesheet>
这是我目前的输出:
105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||
但应该是:
105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||
105604|T|HLK-TEST-D|SOMETHING4|||
答案 0 :(得分:1)
第4个rec
元素正在被过滤掉,因为空rec
元素上的空模板与ics
元素的最后ics
元素不匹配&#34; HLK& #34 ;.在您的XML中,第4个rec
元素的最后一个rec
元素的值为&#34; HKU&#34;,它不以&#34; HLK&#34;开头。
从示例XML看来,空模板的标准似乎应该是与itemdef/ics/code
元素不匹配的position()
元素,这些元素以&#34; HLK&#34;开头,无论如何ics
元素的<xsl:template match="rec[not(itemdef/ics/code[starts-with(.,'HLK')])]" />
:
rec
或者,您可以在rec
元素上一般匹配空模板,另一个匹配具有&#34; HLK&#34;的code
元素。 <xsl:template match="rec" />
<xsl:template match="rec[itemdef/ics/code[starts-with(.,'HLK')]]">
<xsl:apply-templates select="itemdef"/>
</xsl:template>
元素。
{{1}}