Использование xslt для установки условий на теги? - PullRequest
0 голосов
/ 06 июля 2018

XSL Новичок

У меня есть XML-файл как

<parent>
  <child1>The child</child1>
  <child2>
     <subchild1>The subchild 1 </subchild1>
     <subchild2>The subchild 2 </subchild2>
     <ref>1</ref>
  </child2>
  <child3>
  <address> 23 </address>
  <mail> test@test.com </mail>
</child3>
</parent>

Я хочу, чтобы xsl внес следующие изменения

<parent>
  <child1>The child</child>
  <child2>
     <subchild1>The subchild 1 </subchild>
     <subchild2>The subchild 2 </subchild>
     <ref refid = "aff1">1</ref>
  </child2>
  <child3>
  <address> 23 </address>
  <mail type="email"> test@test.com </mail>
</parent>

Мой XSL пока что

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

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

    </xsl:template>
</xsl:transform>

Я могу перебирать каждый тег и текст, но как поставить оператор if и внести изменения. aff будет исправлено, но число будет добавлено. Я запускаю это в Ubuntu

$ xsltproc iterate1.xsl headerout1.xml

1 Ответ

0 голосов
/ 06 июля 2018

Вы хорошо начали с использования шаблона идентификации. Все, что вам нужно сделать сейчас, это добавить шаблоны, которые соответствуют узлам, которые вы хотите изменить. XSLT имеет концепцию приоритета шаблона, поэтому, если два шаблона соответствуют данному узлу, используется шаблон с более высоким приоритетом. (Шаблон, соответствующий конкретному имени узла, например, «ref», имеет приоритет 0, по сравнению с шаблоном, соответствующим «node ()», который имеет приоритет -0,5)

Итак, чтобы преобразовать ref, вы бы сделали это ...

<xsl:template match="ref">
    <xsl:copy>
        <xsl:attribute name="id">
            <xsl:value-of select="." />
        </xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>    

Или, что еще лучше, используйте Шаблоны значений атрибутов и сделайте следующее:

<xsl:template match="ref">
    <ref id="{.}">
        <xsl:apply-templates select="@*|node()"/>
    </ref>
</xsl:template>    

Вы бы сделали что-то подобное для mail (хотя немного проще, поскольку значение не является динамическим)

Попробуйте это XSLT

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

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

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

    <xsl:template match="ref">
        <ref id="{.}">
            <xsl:apply-templates select="@*|node()"/>
        </ref>
    </xsl:template>    
</xsl:transform>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...