我正在努力解决以下问题。 希望你们中的任何一个人建议或指导我解决这个问题。
我有一个低于伪xsd类型的有效负载。
<element name=Main maxCoccurs=unbounded>
<complexType>
<element name=input1/>
<element name=input2/>
<element name=input3/>
<element name=input4/>
<element name=input5/>
<element name=inside/>
<element name=username/>
<element name=address/>
</complextype>
<element>
Main是一个可重复的元素。 我想检查用户名,如果所有节点的用户名中的值不相等,那么我需要为第一个节点用户名分配空白值。
我怎样才能在转型中做到这一点?
我正在尝试如下: 在变量中获取firt用户名,然后使用for-each检查所有用户名。 如果它不相等....但我不能将空白值分配给第一个节点,因为我是第n个节点的用户名。
我正在考虑使用变量来表示unmatched = true(),但是xslt不能允许我们在声明后对变量进行更改。 所以即使是那个选项也被排除了。
我怎样才能做到这一点? 帮我解决这个问题..
希望我很清楚。
干杯 Chandru
答案 0 :(得分:0)
假设foo
是您可以使用的main
元素的父元素的名称
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* , node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="foo[some $m in main satisfies $m/username != main/username]/main[1]/username">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
以下是一些输入样本:
<root>
<foo>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u1</username>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u1</username>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u2</username>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u1</username>
<address/>
</main>
</foo>
</root>
当样式表应用Saxon 9.4时,我得到的输出是
<root>
<foo>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username/>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u1</username>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u2</username>
<address/>
</main>
<main>
<input1/>
<input2/>
<input3/>
<input4/>
<input5/>
<inside/>
<username>u1</username>
<address/>
</main>
</foo>
</root>
第一个username
的{{1}}现在为空,因为有一个main
main
与其他username
不同。
[编辑] 答案被接受,我有点困惑,但评论说你需要一个XSLT 1.0解决方案。我将在下面提供一个XSLT 1.0样式表:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="foo[main[username != ../main/username]]/main[1]/username">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>