Нужна помощь в выводе текстовых узлов из XML с помощью XSLT - PullRequest
2 голосов
/ 26 августа 2010

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

INPUT:

<TestResult>
<set-value idref="account_lockout_duration_var">900</set-value>
<set-value idref="account_lockout_threshold_var">5</set-value>
    <group>
      <id>345</id>
      <id>265</id>
      <field>true</field>
      <message>dont do that</message>
    </group>
    <group>
      <id>333</id>
      <field>false</field>
    </group>
</TestResult>

OUTPUT

345,265,true
333,false

Это просто фрагмент, в группе может быть только один элемент поля, но элементы id не связаны.

Я изменил ввод, используя ответы ниже, я получаю дополнительный вывод (все выводится, когда мне нужны только элементы id и field). спасибо.

Ответы [ 3 ]

2 голосов
/ 26 августа 2010

Я бы сделал что-то вроде этого:

XML:

<TestResult>
  <set-value idref="account_lockout_duration_var">900</set-value>
  <set-value idref="account_lockout_threshold_var">5</set-value>
  <group>
    <id>345</id>
    <id>265</id>
    <field>true</field>
    <message>dont do that</message>
  </group>
  <group>
    <id>333</id>
    <field>false</field>
  </group>
</TestResult>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="/TestResult/group">
    <xsl:apply-templates/>
    <xsl:if test="following-sibling::group">
      <xsl:text>&#xA;</xsl:text>  
    </xsl:if>
  </xsl:template>

  <xsl:template match="/TestResult/group/id|field">
    <xsl:value-of select="."/>
    <xsl:if test="following-sibling::id or following-sibling::field">,</xsl:if>
  </xsl:template>

</xsl:stylesheet>

OUT:

345,265,true
333,false
1 голос
/ 26 августа 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="group/*[not(self::message)]">
        <xsl:value-of select="concat(.,substring(',&#xA;',
                                                 1 + boolean(self::field),
                                                 1))"/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

Выход:

345,265,true
333,false
1 голос
/ 26 августа 2010

Было бы что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="group">
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="id">
    <xsl:apply-templates/>
    <xsl:text>;</xsl:text>
  </xsl:template>
  <xsl:template match="field">
    <xsl:apply-templates/>
    <xsl:text>
</xsl:text>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...