используйте XSLT для сокращения вывода XML - PullRequest
2 голосов
/ 07 апреля 2011

Как я могу использовать XSLT, выбрать только некоторые теги xml из моего входного xml в мой выходной XML? Пример ввода:

<Country value="USA">
    <State value="KY>
        <City value="Hebron" />
        <City value="Lexington" />
        <City value="Owensboro" />
        <City value="Jonesville" />
    </State>
    <State value="OH">
         <City value="Cincinnati" />
         <City value="Columbus" />
         <City value="Cleveland" />
         <City value="Jonesville" />
    </State>
    <State value="IN" >
         <City value="Indianapolis" />
    </State>
 </Country>

Итак, оставьте теги Страна / Штат на месте и копируйте только Хеврон и Цинциннати?

ожидаемый результат:

<Country value="USA">
    <State value="KY>
        <City value="Hebron" />
    </State>
    <State value="OH">
         <City value="Cincinnati" />
    </State>
 </Country>

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Следующая таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]" />
</xsl:stylesheet>

На этом входе:

<Country value="USA">
    <State value="KY">
        <City value="Hebron" />
        <City value="Lexington" />
        <City value="Owensboro" />
    </State>
    <State value="OH">
        <City value="Cincinnati" />
        <City value="Columbus" />
        <City value="Cleveland" />
    </State>
</Country>

Дает следующий результат:

<Country value="USA">
    <State value="KY">
        <City value="Hebron" />
    </State>
    <State value="OH">
        <City value="Cincinnati" />
    </State>
</Country>

Эта таблица стилей использует преобразование идентичности *1011* для копирования всех выходных данных, кроме нежелательных узлов, без изменений.

Другой пример

Вы также можете удалить любой элемент State, который не имеет нужного города. Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]"/>
    <xsl:template 
           match="State[not(City[@value='Hebron' or @value='Cincinnati'])]"/>
</xsl:stylesheet>

Применяется к этому входу:

<Country value="USA">
    <State value="KY">
        <City value="Hebron" />
        <City value="Lexington" />
        <City value="Owensboro" />
    </State>
    <State value="OH">
        <City value="Cincinnati" />
        <City value="Columbus" />
        <City value="Cleveland" />
    </State>
    <State value="MO">
        <City value="St. Louis" />
    </State>
</Country>

Производит:

<Country value="USA">
    <State value="KY">
        <City value="Hebron" />
    </State>
    <State value="OH">
        <City value="Cincinnati" />
    </State>
</Country>
1 голос
/ 07 апреля 2011

Вот мое (вероятно, неадекватное) решение 2.0. Города - это регулярное выражение, переданное в качестве параметра.

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="Cities" select="'Cincinnati|Hebron'"/>

  <xsl:template match="State">
    <xsl:if test="exists(City[matches(@value, $Cities)])">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <xsl:template match="State/City">
    <xsl:if test="matches(@value, $Cities)">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
   </xsl:template>

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

</xsl:stylesheet>
1 голос
/ 07 апреля 2011

Это оставит только определенные города:

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


<xsl:template match="City[@value != 'Hebron' and @value != 'Cincinnati']"/>

Это оставит только первый город:

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


<xsl:template match="City[position() &gt; 1]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...