Удаление элемента со значением дочернего элемента от 0 до XSLT - PullRequest
1 голос
/ 18 января 2011

У меня есть XML-файл, который мне нужно преобразовать с помощью XSLT.В моем файле XSLT я делаю несколько вещей с файлом XML.Я сначала копирую все элементы;тогда я переименую некоторые элементы.Наконец, мне нужно удалить для вывода все dealer-code element, у которых dealer-code-name равно 0. Первые 2 части, которые у меня работают, но я пробовал каждый фрагмент кода, который нашел в Интернете, и не могу удалить этиоскорбительные dealer-code элементы.Я новичок в XSLT, поэтому, возможно, я все делаю неправильно;любая помощь будет оценена.

Частичный код XML:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?>
 <AdBaseData>
  <AdBasePreprintInfo FromDistribute="true">
       <PreprintInsert>
        <Sides>2</Sides>
        <PageCount>2</PageCount>
        <InsertSchedule>
            <AdLocInfo>
                <rundates>
                    <date>12042010</date>
                </rundates>
            </AdLocInfo>
            <invoice-text>South Plaza - Stalker Advertisin</invoice-text>
            <BillingOverride Type="Subscriber">49996</BillingOverride>
            <deal-code0>
                <dealer-code-name>A20</dealer-code-name>
                <Delivery-Method Type="Subscriber">
                    <Selected>true</Selected>
                </Delivery-Method>
            </deal-code0>
            <deal-code1>
                <dealer-code-name>0</dealer-code-name>
                <Delivery-Method Type="Subscriber">
                    <Selected>true</Selected>
                </Delivery-Method>
            </deal-code1>
  </InsertSchedule>
</PreprintInsert>

Мой xslt:

   <?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" version="1.0" encoding="UTF-8" indent="yes"/>
     <xsl:template match="@* | node()">
       <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
       </xsl:copy>
     </xsl:template>
    <xsl:template match="*[starts-with(name(), 'deal-code')]">
       <xsl:element name="dealer-code">
         <xsl:apply-templates/>
       </xsl:element>
     </xsl:template>
     <xsl:template match="dealer-code[@dealer-code-name='0']">
     </xsl:template>
    </xsl:stylesheet>

Переименование deal-code вdealer-code работает.Тем не менее, последняя часть не выводит dealer-code-name со значением 0 не делает.Мой полученный XML-файл все еще содержит список всех элементов dealer-code.

Ответы [ 3 ]

1 голос
/ 18 января 2011

Этот вход:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?>
<AdBaseData>
  <AdBasePreprintInfo FromDistribute="true">
    <PreprintInsert>
      <Sides>2</Sides>
      <PageCount>2</PageCount>
      <InsertSchedule>
        <AdLocInfo>
          <rundates>
            <date>12042010</date>
          </rundates>
        </AdLocInfo>
        <invoice-text>South Plaza - Stalker Advertisin</invoice-text>
        <BillingOverride Type="Subscriber">49996</BillingOverride>
        <deal-code0>
          <dealer-code-name>A20</dealer-code-name>
          <Delivery-Method Type="Subscriber">
            <Selected>true</Selected>
          </Delivery-Method>
        </deal-code0>
        <deal-code1>
          <dealer-code-name>0</dealer-code-name>
          <Delivery-Method Type="Subscriber">
            <Selected>true</Selected>
          </Delivery-Method>
        </deal-code1>
      </InsertSchedule>
    </PreprintInsert>
  </AdBasePreprintInfo>
</AdBaseData>

с этой таблицей стилей:

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

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

  <xsl:template match="*[starts-with(name(), 'deal-code')][dealer-code-name = '0']"/>

</xsl:stylesheet>

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

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?><AdBaseData>
   <AdBasePreprintInfo FromDistribute="true">
      <PreprintInsert>
         <Sides>2</Sides>
         <PageCount>2</PageCount>
         <InsertSchedule>
            <AdLocInfo>
               <rundates>
                  <date>12042010</date>
               </rundates>
            </AdLocInfo>
            <invoice-text>South Plaza - Stalker Advertisin</invoice-text>
            <BillingOverride Type="Subscriber">49996</BillingOverride>
            <deal-code0>
               <dealer-code-name>A20</dealer-code-name>
               <Delivery-Method Type="Subscriber">
                  <Selected>true</Selected>
               </Delivery-Method>
            </deal-code0>
         </InsertSchedule>
      </PreprintInsert>
   </AdBasePreprintInfo>
</AdBaseData>
0 голосов
/ 18 января 2011
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
  </xsl:template>
  <xsl:template match="*[starts-with(name(), 'deal-code')]">
     <xsl:if test="dealer-code-name!='0']">
       <xsl:element name="dealer-code">
       <xsl:apply-templates/>
       </xsl:element>
     </xsl:if>
  </xsl:template>
</xsl:stylesheet>

у вас нет элемента dealer-code во входном XML-файле, но вы можете фильтровать элементы обработки, начиная с deal-code, проверяя, есть ли у них дочерний элемент dealer-code-name, значение которого равно 0

0 голосов
/ 18 января 2011

У вас есть две проблемы:

  1. У вас нет элементов dealer-code в исходном XML.Это deal-code0 и deal-code1
  2. dealer-code-name это элемент, а не атрибут.

Ваш XPATH в настоящее время соответствует dealer-code элементам с @dealer-code-name='0'.Поскольку нет элементов dealer-code и атрибутов dealer-code-name, он никогда не совпадает и не подавляет содержимое.

Вам необходимо настроить XPATH так, чтобы элементы deal-code соответствовали тому, какнаходятся в другом шаблоне и добавляют дополнительный фильтр предикатов для дочерних элементов dealer-code-name со значением 0. Кроме того, поскольку оба ваших шаблона имеют одинаковую логику сопоставления, они могут получить одинаковый уровень приоритета.Возможно, вам придется увеличить приоритет этого шаблона редактирования, чтобы он «выиграл» в сравнении с более общим соответствием:

 <xsl:template match="*[starts-with(name(), 'deal-code') and dealer-code-name='0']" priority="1"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...