Как избежать параметра со всеми внутри? - PullRequest
0 голосов
/ 21 августа 2009

Алло, во-первых, я не очень хорошо знаком с xml и подобным языком, поэтому, пожалуйста, не наказывайте меня своим вопросом для начинающих: D

У меня есть XML-файл, похожий на этот:

<?xml version="1.0" encoding="utf-8" ?>
<mainstuff>
    <category_major>
        <project_name>Dream</project_name>
        <project_attribute>Version 1.0</project_attribute>
        <category_A></category_A>
        <category_B></category_B>
        <category_C></category_C>
    </category_major>
</mainstuff>

Затем я получил XSLT-файл, похожий на этот:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="/">
    <xsl:element name="mainstuff">
      <xsl:attribute name="version">1.0</xsl:attribute>
      <xsl:apply-templates/>
    </xsl:element>    
  </xsl:template>

  <xsl:template match="category_major">
    <xsl:element name="category_major">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

    <xsl:template match="category_A">
    <xsl:element name="category_A">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

    <xsl:template match="category_B">
    <xsl:element name="category_B">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

    <xsl:template match="category_C">
    <xsl:element name="category_C">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Я хочу избежать двух параметров "имя_проекта" и "атрибут_проекта". Я хочу такой результат:

<?xml version="1.0" encoding="utf-8" ?>
<mainstuff>
    <category_major>
        <category_A></category_A>
        <category_B></category_B>
        <category_C></category_C>
    </category_major>
</mainstuff>

Но что я получу после трансформации:

<?xml version="1.0" encoding="utf-8"?>
<mainstuff version="1.0">
    <category_major>
        **Dream
        Version 1.0**
        <category_A />
        <category_B />
        <category_C />
    </category_major>
</mainstuff>

Текст все еще в нем. Как я могу это исправить. Что я делаю неправильно ? И как я могу понять, чтобы получить параметры, но без текста внутри него? В моем примере вывод такой:

<?xml version="1.0" encoding="utf-8" ?>
<mainstuff>
    <category_major>
        **<project_name></project_name>
        <project_attribute></project_attribute>**
        <category_A></category_A>
        <category_B></category_B>
        <category_C></category_C>
    </category_major>
</mainstuff>

Спасибо за вашу помощь: D

Ответы [ 2 ]

2 голосов
/ 21 августа 2009

Если шаблон не соответствует шаблону, используется шаблон по умолчанию. Эффект шаблона по умолчанию заключается в эффективном выводе строкового значения узла - для элемента это выглядит как объединение всех дочерних текстовых узлов.

Если вы хотите переопределить это поведение, вам нужно предоставить свои собственные шаблоны запрета операций для элементов, которые вы хотите пропустить:

<xsl:template match="project_name | project_attribute" />

Для вашего второго запроса, если вы хотите вывести элемент, но удалить все содержимое, вы можете использовать xsl:copy:

<xsl:template match="project_name | project_attribute">
  <xsl:copy />
</xsl:template>

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

0 голосов
/ 21 августа 2009

Попробуйте инвертировать, сопоставьте то, что вы хотите исключить, а не то, что хотите включить:

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

<xsl:template match="*" priority="0">
     <xsl:element name="{local-name()}">
         <xsl:apply-templates />
     </xsl:element>
</xsl:template>

<xsl:template match="project_name" priority="1"></xsl:template>
<xsl:template match="project_attribute" priority="1"></xsl:template>

Извините, если это немного загадочно, но я надеюсь, что это поможет

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