XSLT - изменение формата XML и возможность повторного использования - PullRequest
0 голосов
/ 20 июля 2011

Я мог бы использовать некоторую помощь с моим преобразованием XML, я видел другие подобные вопросы, но, поскольку моя схема XML немного неуклюжа, у меня возникают проблемы с ее применением.

Вот формат XML, который у меня есть

<root>
  <row>
  <var name="Name" value="Rusell" />
  <var name=" Surname" value=" Anthony" />
  <var name=" Country" value=" UK" />
  <var name=" Job" value="Web Designer" />
  <var name=" Cabin" value="345" />
 </row>
  <row>
  <var name="Name" value="Wolf" />
  <var name=" Surname" value=" Werner" />
  <var name=" Country" value=" Germany" />
  <var name=" Job" value="Linux IT" />
  <var name=" Cabin" value="234" />
 </row>
</root>

Я хочу, чтобы это выглядело так, чтобы я мог легко получать доступ к полям.

<root>
 <row name="Rusell" surName="Anthony" country="UK" job="Web Designer" cabin="345" />
 <row name="Wolf" surname="Werner" country="Germany" job="Linux IT" cabin="234" />
</row>

Я достиг прогресса в том, что касается форматирования, это то, что я получил до сих пор - значения не были вставлены.

<root>
<row Name="" Surname="" Country="" Job="" Cabin="" />
<row Name="" Surname="" Country="" Job="" Cabin="" />
<row Name="" Surname="" Country="" Job="" Cabin="" />
<row Name="" Surname="" Country="" Job="" Cabin="" />
</root>

Вот мой XSLT-файл - Вы заметите, что для пары атрибутов при использовании значения select у меня другой синтаксис, это просто для демонстрации того, что я пробовал.

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

</root>
</xsl:template>

<xsl:template match="row">

<row>
<xsl:attribute name="Name">
<xsl:value-of select="value"/>

</xsl:attribute>
<xsl:attribute name="Surname">
<xsl:value-of select="row/root/name/value"/>

</xsl:attribute>
<xsl:attribute name="Country">
<xsl:value-of select="root/row/value"/>

</xsl:attribute>
<xsl:attribute name="Job">
<xsl:value-of select="@value"/>

</xsl:attribute>
<xsl:attribute name="Cabin">
<xsl:value-of select="value"/>

</xsl:attribute>

</row>

</xsl:template>

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

Итак, как бы мне создать файл XSLT, который выполняет следующее:

For each Node = root/row
Create row = (value@name & value@value)

I.E. То же самое, что я пытаюсь сделать выше, но можно использовать повторно, так как мне не нужно знать значения имени (фамилия, каюта и т. Д.), Так что это применимо к моему первому XML-файлу и следующим.

<root>
  <row>
  <var name="differentName" value="x" />
  <var name="anotherdifferentname" value="y" />
 </row>
  </root>

Если мне нужно быть более ясным, пожалуйста, дайте мне знать и заранее спасибо.

1 Ответ

1 голос
/ 20 июля 2011

Это должно сделать это

<?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="row">
    <row>
      <xsl:apply-templates select="var"></xsl:apply-templates>
    </row>
  </xsl:template>

  <xsl:template match="var">
    <xsl:variable name="attributeName" select="@name">
    </xsl:variable>
    <xsl:attribute name="{$attributeName}">
      <xsl:value-of select="@value"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...