我有以下问题。我需要知道在同名的x个子节点上是否满足了一个条件,并且不处理行。我正在将xml解析为一个文本文件,但它可能有两个或三个相同的子节点,它们具有不同的值,如果其中一个满足条件,那么处理行。
以下是我的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必须处理,因为它们有一个值为HLK的“代码”标记。
以下是我对XSLT的看法..。虽然我只能拿到第一和第三张唱片.你能帮忙吗?
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|||发布于 2014-03-14 03:32:14
第四个rec元素被过滤掉了,因为空模板匹配在rec元素上,后者是最后一个ics元素,而不是以"HLK“开头。在您的XML中,第4个ics元素的最后一个rec元素的值为"HKU",它不以"HLK“开头。
从示例XML看来,空模板的条件应该是匹配没有以"HLK“开头的rec元素,而不管ics元素的position()是什么:
<xsl:template match="rec[not(itemdef/ics/code[starts-with(.,'HLK')])]" />或者,您可以在rec元素上进行一般的空模板匹配,而另一个匹配具有"HLK“code元素的rec元素。
<xsl:template match="rec" />
<xsl:template match="rec[itemdef/ics/code[starts-with(.,'HLK')]]">
<xsl:apply-templates select="itemdef"/>
</xsl:template> https://stackoverflow.com/questions/22394990
复制相似问题