Есть ли способ исправить XML в более читаемую форму без ручной работы? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть XML-файл от третьего лица, и значения действительно трудно указать в XSLT.Пример одного «объекта» ниже.Мне очень сложно указывать значения между строками.docrev, который имеет значение '-', например.

<object level="1" id="2018488">
<integer>
<name>level</name>
<value>1</value>
</integer>
<string>
<name>docrev</name>
<value>-</value>
</string>
<string>
<name>DocID</name>
<value>2018488</value>
</string>
<string>
<name>Custom_Pos</name>
</string>
<string>
<name>Custom_Qty</name>
</string>
<string>
<name>DocDescr</name>
<value>Levy</value>
</string>
<date>
<name>StatusDate</name>
<value>2012-04-30</value>
</date>
</object>

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Ну, <xsl:value-of select="docrev"/> должен выбрать элемент с именем docrev в XPath, поэтому он не может выбрать элемент на основе строкового значения docrev.

В XSLT вы можете легко определитьклавиши для выбора элементов (или вообще узлов) по определенному значению, поэтому для вашего примера вы можете использовать ключ

<xsl:key name="value" match="object/*/value" use="../name"/>

, а затем в контексте вашего примера вы можете использовать key('value', 'docrev') для выборасоответствующий value элемент соответственно <xsl:value-of select="key('value', 'docrev')"/> для вывода его значения:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:key name="value" match="object/*/value" use="../name"/>

  <xsl:template match="/">
      <xsl:value-of select="key('value', 'docrev')"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 6qVRKwW / 1

Или в более широкомВ контексте вы можете сначала проиндексировать элементы object по атрибуту id с помощью другого ключа <xsl:key name="id" match="object" use="@id"/>, а затем использовать его вместе с предыдущим ключом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:key name="id" match="object" use="@id"/>

  <xsl:key name="value" match="object/*/value" use="../name"/>

  <xsl:template match="/">
      <xsl:value-of select="key('value', 'docrev', key('id', '2018488'))"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 6qVRKwW

Используя схемы или DTD, вы также можете предопределить определенные атрибуты или узлы как ID с, а затем использовать функцию id, аналогичную приведенной выше key.

0 голосов
/ 16 октября 2018

Как сделать XML более читабельным

Вывод XSLT станет более читабельным, если указать, что отступ используется при сериализации выходного XML:

<xsl:output method="xml" indent="yes"/>

Вы можете запустить любой XMLчерез XSLT через преобразование идентичности, если ваша единственная цель состоит в том, чтобы красиво напечатать XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 16 октября 2018

Из вашего комментария звучит так, как будто у вас возникают проблемы при получении и печати значения элемента <value>.

Код, который вы разместили, будет искать элемент <docrev>, который делаетне существует в вашем документе.

Звучит так, как будто вы хотите выбрать значение элемента <value>, который имеет элемент <name> с одним братом со значением docrev:

<xsl:value-of select="/object/*[name='docrev']/value"/>

Если вам нужны значения только из <string> элементов, вы можете сделать этот XPath более конкретным:

<xsl:value-of select="/object/string[name='docrev']/value"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...