почему этот xsl пишет текст из узлов - PullRequest
0 голосов
/ 01 марта 2019

В xsl-файл я объявляю шаблон для элемента Prov.Источник xml также содержит элемент Doc, но для этого элемента нет шаблона.

почему xsl transofmation записывает некоторый внутренний текст из элемента Doc?

привет, это ввод XML

<Root>
  <Doc attr1="1" attr2="2" attr3="3">
    <node1 attr1="1" />
    <node2 attr1="2" />
    <node3 attr1="3" />
    <node4>1900-01-01T00:00:00Z</node4>
    <node5>1900-01-01T00:00:00Z</node5>
    <node6>
      <node7>
        <node8>xxx</node8>
        <node9>yyyy</node9>
        <node10>zzz</node10>
      </node7>
    </node6>
    <node11>xxx</node11>
    <node12>yyy</node12>
  </Doc>
  <Prov attr1="1" attr2="2" attr3="3" />
</Root>

мне нужен этот вывод:

<Prov attr1="1" attr2="2" />

это xsl:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"  />
  <xsl:template match="Prov" >
    <xsl:element name="Prov">
      <xsl:copy-of select="@attr1" />
      <xsl:copy-of select="@attr2" />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

это фактический вывод:

<?xml version="1.0" encoding="ISO-8859-1"?>




        1900-01-01T00:00:00Z
        1900-01-01T00:00:00Z


            xxx
            yyyy
            zzz


        xxx
        yyy

      <Prov attr1="1" attr2="2"/>

1 Ответ

0 голосов
/ 01 марта 2019

Причина, по которой вы видите, - встроенный шаблон правил .У вас есть только шаблон, соответствующий Prov.Это оставляет всю ветвь Doc вашего входного XML для обработки этими встроенными шаблонами, которые копируют все текстовые узлы в вывод.

Чтобы предотвратить это, вы могли бы добавить:

<xsl:template match="/Root" >
    <xsl:apply-templates select="Prov"/>
</xsl:template>

к вашей таблице стилей, или - если вы предпочитаете - сократить все это до:

<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="/Root" >
    <Prov attr1="{Prov/@attr1}" attr2="{Prov/@attr2}"/>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...