根据xslt中的当前节点值更改先前的NODE值

时间:2013-02-14 10:08:54

标签: xslt xslt-2.0

我正在努力解决以下问题。 希望你们中的任何一个人建议或指导我解决这个问题。

我有一个低于伪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

1 个答案:

答案 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>