XSLTing xml к другому xml приходит с пустой страницей - PullRequest
0 голосов
/ 25 февраля 2010

Я полностью застрял в том, что происходит, когда я пытаюсь запустить следующий xml против xsl, пытаясь не получить пустую страницу в браузере:

XML:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<Structure>
    <Processes>
        <Process>
            .
            .
            .
        </Process>
    </Processes>
</Structure>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <!--trying to convert the tag to another name -->
    <xsl:template match="/">
        <xsl:element name="NewStructure">
            <xsl:apply-templates select="Processes" />
        </xsl:element>
    </xsl:templates>
    <xsl:template name="convert_processes_tag" match="Processes">
        <xsl:for-each select="Processes">
            <xsl:element name="NewProcess" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Моя цель - заменить тег «Процессы» чем-то другим, а затем и всеми другими тегами внутри xml. Моей первой попыткой было сначала преобразовать большинство внешних тегов. Я попытался сократить xml и xsl до его скелета, но все, что я получил, это пустая страница. Я попробовал поискать в Google, но это только смущает меня. Я знаю, что xsl: template похож на метод в ООП, и я хотел отделить его, потому что при преобразовании тегов в разные имена будет много циклов.

Застрял на несколько часов ... любая помощь будет оценена.

РЕДАКТИРОВАТЬ: я тестировал это с IE. Кто-то отметил, что XML не отображается при тестировании в IE. Это тот случай?

ТИА.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2010

XSLT сделает все обходы деревьев за вас. Вам не нужно использовать циклы for-each или именованные шаблоны. Вам даже не нужно заботиться о том, какие элементы преобразуются до каких других элементов.

Все, что вам нужно сделать, это указать, что вы хотите, чтобы произошло с любым XML-узлом, с которым вы сталкиваетесь.

<Structure>        <!-- write a template that matches "Structure" elements -->
    <Processes>    <!-- write a template that matches "Processes" elements -->
        <Process>  <!-- write a template that matches "Process" elements -->
        </Process>
    </Processes>
</Structure>

итак, это уже довольно далеко:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

  <xsl:template match="Structure">
    <NewStructure>
      <xsl:apply-templates />  <!-- apply-templates is the recursive step -->
    </NewStructure>
  </xsl:template>

  <xsl:template match="Processes">
    <NewProcesses>  <!-- note that you don't even need <xsl:element> -->
      <xsl:apply-templates />
    </NewProcesses>
  </xsl:template>

  <xsl:template match="Process">
    <NewProcesses>
      <xsl:apply-templates />
    </NewProcesses>
  </xsl:template>

  <!-- this empty template prevents blank text nodes from leaking through -->
  <xsl:template match="text()[normalize-space() = '']" />

</xsl:stylesheet>
1 голос
/ 25 февраля 2010

Браузер не является подходящим инструментом, если вы хотите отлаживать XSLT, который преобразует XML в XML, если только это не браузер, такой как Firefox или Opera, а ваш целевой формат XML - это такой формат, как SVG или MathML или XHTML, который браузер знает для визуализации , IE полезен, если вы преобразуете XML в HTML (xsl: output method = "html") или, возможно, в обычный текст (xsl: output method = "text"), но когда вы используете его для преобразования XML в XML (xsl: output method = " xml "), тогда не ожидайте, что вы покажете что-либо, кроме текстовых узлов в результирующем документе. А в вашем случае у вас даже нет текстовых узлов, которые содержат символы, не являющиеся пробелами, поэтому отображать нечего.

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