изменить формат xml с помощью xsl или другого - PullRequest
0 голосов
/ 19 сентября 2010

Могу ли я использовать xsl или что-то подобное, чтобы изменить этот формат

  <rr n="Address">
  <tt>
  <j n="currentAddress">0</j> 
  <j n="city">city</j> 
  </tt>
  </rr>

на это: -

  <Address>
  <tt>
  <currentAddress>0</currentAddress> 
  <city>city</city> 
  </tt>
  <Address>

обратите внимание, что я хочу, чтобы значение атрибута стало элементом, и удалитеЕсли возможно, укажите атрибут.

спасибо

Ответы [ 2 ]

1 голос
/ 19 сентября 2010

Эта таблица стилей также будет работать:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />

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

<!--specialized template for elements with an "n" attribute-->
<xsl:template match="*[@n]">
    <xsl:element name="{@n}">
        <xsl:apply-templates select="node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

Первый шаблон в шаблоне идентификации , который соответствует @* (что означает любой атрибут) и node()(что означает любой элемент, текстовый узел, инструкцию обработки или комментарий).Поведение по умолчанию - копировать соответствующий элемент, а затем apply-templates в любой из его атрибутов или дочерних узлов.

Если никакие другие шаблоны не были объявлены в таблице стилей, тогда этот шаблон идентификации будет совпадать для всех, и XSLT просто сделает копию документа XML.

Второй шаблон соответствует на *[@n], который является любым элементом, который имеет атрибут "n".* - подстановочный знак для любого элемента.Квадратные скобки представляют собой фильтр предикатов, который действует подобно предложению SQL WHERE.Любые условия, указанные в предикате, должны быть истинными, чтобы шаблон соответствовал выбранным параметрам.Фильтр предикатов оценивает из контекста сопоставленного элемента, поэтому, если вы «стоите» на элементе, имеет ли он @n?Если это так, то этот шаблон соответствует.

Второй шаблон имеет более конкретные критерии соответствия, чем первый шаблон «идентичности», поэтому он «выигрывает» и будет соответствовать элементам, которые имеют @n. * 1020.*

Логика для второго шаблона заключается в создании элемента с именем значения @n и затем apply-templates для любого дочернего элемента node() (который включает в себя как text(), так и элементы, ноне включает атрибуты).

0 голосов
/ 19 сентября 2010

Да, XSL можно использовать:).

Вот XSL:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />


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

    <xsl:template match="*">
        <xsl:choose>
            <xsl:when test="@n">
                <xsl:variable name="eleName">
                    <xsl:value-of select="@n" />
                </xsl:variable>
                <xsl:element name="{$eleName}">
                    <xsl:value-of select="text()" />
                    <xsl:apply-templates select="*" />
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="*" />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

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