Как копировать детей с помощью XSL - PullRequest
2 голосов
/ 01 декабря 2011

Как скопировать детей с помощью XSL?

Источник:

<body>
   <keyword><i color="blue">super</i>man</keyword>
   <keyword><i color="blue">super</i>man</keyword>
   <keyword><i color="blue">super</i>woman</keyword>
</body>

Я использую следующее

  <xsl:template match="keyword" >
    <keyword>
      <xsl:attribute name="type">Key Words Head First</xsl:attribute>

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

  </xsl:template>

При использовании приведенного выше кода я получаю двойные вложенные теги <keyword>.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Вам не нужно явно выводить keyword и копировать существующие keyword, используя xsl:copy.Как альтернатива ответу @ DevNull :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="keyword">
        <xsl:copy>
            <xsl:attribute name="type">Key Words Head First</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

... при применении к вашему входу выдает следующее:

<body>
    <keyword type="Key Words Head First"><i color="blue">super</i>man</keyword>
    <keyword type="Key Words Head First"><i color="blue">super</i>man</keyword>
    <keyword type="Key Words Head First"><i color="blue">super</i>woman</keyword>
</body>

Из комментариев:

... что если атрибут необходимо переопределить.Например, предположим, что ключевое слово уже имеет атрибут type.

В этом случае не копируйте существующий атрибут type:

<xsl:template match="keyword">
    <xsl:copy>
        <xsl:attribute name="type">Key Words Head First</xsl:attribute>
        <xsl:apply-templates select="@*[not(name()='type')]|node()"/>
    </xsl:copy>
</xsl:template>
3 голосов
/ 01 декабря 2011

xsl:copy копирует элемент контекста, который в данном случае равен keyword.Обычно вы оборачиваете существующий keyword новым.

Попробуйте удалить xsl:copy:

  <xsl:template match="keyword" >
    <keyword type="Key Words Head First">
      <xsl:apply-templates select="node()|@*[name() != 'type']"/>
    </keyword>    
  </xsl:template>

Примечание. Окончательный вывод будет зависеть от наличия других шаблонов.для обработки потомков keyword (например, преобразование идентичности).

Более подробную информацию о копировании и преобразовании идентичности можно найти здесь: http://www.w3.org/TR/xslt#copying

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...