Специальный шаблон узла XML не соответствует - PullRequest
0 голосов
/ 20 февраля 2012

В настоящее время я пытаюсь скопировать XML-документ в новый и переименовывать некоторые узлы по мере продвижения.Моя проблема, однако, заключается в том, что мои шаблоны не используются, и только глобальный:

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

, а мой конкретный шаблон (адаптирован для ниже):

  <xsl:template match="F">
    <G>
      <xsl:apply-templates/>
    </G>
  </xsl:template>

Структура xmlаналогичен этому, однако адаптирован из-за характера работы:)

<T>
 <A>
  <B>
  </B>
  <C>
  </C>
 </A>
 <D>
  <E>Data</E>
  <F>Data</F>
 </D>
</T>

При выполнении этого в VS2010 я вижу, что он попадает в строку F в XML, однако все еще применяется общий шаблон ине более конкретный.Есть идеи, почему это будет?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Этот ОП скрыл самый важный факт о документе XML - как он говорит нам в более позднем комментарии: " XML использует пространство имен " ...

Вот решение этого столь уточненного вопроса :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="some:namespace" xmlns="some:namespace"
 exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="x:F">
     <G>
       <xsl:apply-templates/>
     </G>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML (на основепространство имен, к которому допущен OP ...):

<T xmlns="some:namespace">
    <A>
        <B>   </B>
        <C>   </C>
    </A>
    <D>
        <E>Data</E>
        <F>Data</F>
    </D>
</T>

желаемый, правильный результат :

<T xmlns="some:namespace">
    <A>
        <B />
        <C />
    </A>
    <D>
        <E>Data</E>
        <G>Data</G>
    </D>
</T>

Объяснение :

Проблема в исходном коде заключается в следующем:

  <xsl:template match="F">

Этот шаблон соответствует элементу F, который не находится в пространстве имен.Однако все элементы настоящего XML-документа находятся в каком-то нераскрытом пространстве имен, а не в каком-либо пространстве имен.Поэтому приведенный выше шаблон не может соответствовать элементу F в пространстве имен, поскольку такого элемента (F в пространстве имен) не существует.

Решение состоит в том, чтобы определить то же пространство имен в преобразовании XSLT ичтобы шаблон соответствовал элементу F в этом пространстве имен.

0 голосов
/ 20 февраля 2012

Кажется, работает нормально для меня.Я использовал следующую таблицу стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="F">
    <G>
        <xsl:apply-templates/>
    </G>
</xsl:template>
</xsl:stylesheet>

и запустил ее в своем XML-коде, возвращая следующее:

<?xml version="1.0" encoding="UTF-8"?>
<T>
<A>
    <B>
</B>
    <C>
</C>
</A>
<D>
    <E>Data</E>
    <G>Data</G>
</D>

Какой результат вы хотите получить.Так можете ли вы дать немного больше информации о том, где что-то идет не так?

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