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 是一个可重复的元素。我想检查用户名,如果所有节点的用户名中的值不相等,那么我需要为第一个节点用户名分配空白值。

我如何在转型中做到这一点?

我正在尝试如下:在变量中获取第一个用户名,然后使用 for-each 检查所有用户名。如果它不相等....但是我不能将空白值分配给第一个节点,因为我在第 n 个节点的用户名中的某个位置。

我正在考虑使用变量来表示 unmatched=true(),但是 xslt 不允许我们在声明后对变量进行更改。因此,即使是该选项也被排除在外。

我怎样才能做到这一点?帮我解决这个..

希望我清楚。

干杯钱德鲁

4

1 回答 1

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一个的 themain现在是空的,因为有一个mainusername其他的不同。

[编辑] 当答案被接受时,我有点困惑,但有评论说您需要 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>
于 2013-02-14T11:11:27.723 回答