Что такое XSLT для записи определенных атрибутов узла один в строку? - PullRequest
0 голосов
/ 19 апреля 2010

Мне нужна таблица стилей XML (XSLT), которая поместит атрибуты нескольких конкретных дочерних узлов в одну строку. Что такое XSLT для этого?

Я недавно задал связанный вопрос , что кто-то предложил таблицу стилей для решения, но их таблица стилей по какой-то причине не работала, и мне любопытно, почему - атрибуты просто не заканчиваются в режиме реального времени.

Например, мой XML может выглядеть так:

<MyXML>
    <NodeA>
       <ChildNode value1='5' value2='6' />
    </NodeA>
    <NodeB>
       <AnotherChildNode value1='5' value2='6' />
    </NodeB>
    <NodeC>
       <AnotherChildNode value1='5' value2='6' />
    </NodeC>
</MyXML>

И мне нужна таблица стилей, которая будет расширять все NodeA и NodeB, но не NodeC, и выглядеть так:

<MyXML>
    <NodeA>
       <ChildNode 
          value1='5' 
          value2='6' />
    </NodeA>
    <NodeB>
       <AnotherChildNode 
          value1='5' 
          value2='6' />
    </NodeB>
    <NodeC>
       <AnotherChildNode value1='5' value2='6' />
    </NodeC>
</MyXML>

Ответы [ 3 ]

1 голос
/ 19 апреля 2010

XML, они полностью идентичны. Поэтому преобразование их с помощью XSLT не изменит их.

Так что вы можете попробовать

  1. Злоупотреблять некоторым процессором XSLT (с идентификатором XSLT-преобразования) как «симпатичным» принтером.

  2. Получите или напишите специальный симпатичный принтер.

  3. Оставьте XML как есть и адаптируйте следующий шаг в цепочке обработки для анализа XML вместо анализа значений в строках.

Я бы предпочел 3.

1 голос
/ 19 апреля 2010

Хм ... Если (и только если) входной XML уже имеет правильный отступ, вы можете избежать неприятностей с этим:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> 
  <xsl:output encoding="utf-8" />

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

  <xsl:template match="NodeA/*|NodeB/*">
    <xsl:variable name="spc" select="preceding-sibling::text()[1]" />
    <xsl:value-of select="concat('&lt;', name())" disable-output-escaping="yes" />
    <xsl:for-each select="@*">
      <xsl:value-of select="concat($spc, '    ', name(), '=&quot;', ., '&quot;')" />
    </xsl:for-each>
    <xsl:choose>
      <xsl:when test="node()">
        <xsl:value-of select="'&gt;'" disable-output-escaping="yes" />
        <xsl:apply-templates select="node()" />
        <xsl:value-of select="concat('&lt;/', name(), '&gt;')" disable-output-escaping="yes" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="' /&gt;'" disable-output-escaping="yes" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

Но, если честно, я считаю, что это именно тот мерзкий взлом, о котором говорит @echox.

Вывод вышеизложенного будет:

<MyXML>
    <NodeA>
       <ChildNode
           value1="5"
           value2="6" />
    </NodeA>
    <NodeB>
       <AnotherChildNode
           value1="5"
           value2="6" />
    </NodeB>
    <NodeC>
       <AnotherChildNode value1="5" value2="6"></AnotherChildNode>
    </NodeC>
</MyXML>
1 голос
/ 19 апреля 2010

Я бы сказал, что XSLT не подходит для этой работы.

Цель XSLT - преобразовать данные из одного формата в другой.

Вы можете добиться вывода новой строки для «красивой печати», но вы должны помнить, что это всегда своего рода «взлом».

Есть ли причина для использования XSLT, а не $ PreferedScriptingLanguage?

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