Как удалить узел, используя self :: in xsl? - PullRequest
0 голосов
/ 21 февраля 2012

, например, ниже - это xml

<products>
    <product>
        <name>Pen</name>
        <Quantity>2</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product> 
    <product>
        <name>Pencil</name>
        <Quantity>20</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
    <product>
        <name>Bag</name>
        <Quantity>25</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
</products>

в моем xsl i, как показано ниже для удаления

<xsl:copy-of select="node()[not(self::Quantity)]"/>

Мне также нужно удалить подузел <Currency> из <Amount>

я пытаюсь, как показано ниже

<xsl:copy-of select="node()[not(self::Quantity) and not(self::Amount/Currency)]"/>

, но не работает нормально.он удалит все узлы из <Amount>

Как удалить только подузел <Currency>?

1 Ответ

2 голосов
/ 21 февраля 2012

Если вы действительно хотите использовать self

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="node()[self::Currency]"/>

или если вы хотите узнать другой более простой способ:)

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  <xsl:template match="Currency"/>

Приведенные выше шаблоны копируют все остальные теги, кроме <Currency>

РЕДАКТИРОВАТЬ: Заменить код ниже

<xsl:template match="product">
   <product>
    <xsl:for-each select="key('kProdByName', name)">
      <xsl:if test="position() = 1">
        <xsl:copy-of select="node()"/>
      </xsl:if>
    </xsl:for-each>
   </product>
</xsl:template>

На это: (надеюсь, это работает)

  <xsl:template match="product">
    <product>
      <xsl:for-each select="key('kProdByName', name)">
        <xsl:if test="position() = 1">
          <xsl:apply-templates select="node()|@*"/>
      </xsl:if>
      </xsl:for-each>
    </product>
  </xsl:template>

  <xsl:template match="Currency|Quantity"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...