Решение проблем с пространством имен XSLT - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь использовать XSLT для преобразования XML-документа в очень похожий XML-документ, но с несколькими дополнениями.У меня проблемы с получением xsl: copy-of для правильной работы.Когда я пытаюсь преобразовать следующий пример XML-документа:

<?xml version="1.0" encoding="UTF-8"?>
<mods xmlns="http://www.loc.gov/mods/v3" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:mods="http://www.loc.gov/mods/v3"
xsi:schemaLocation="http://www.loc.gov/mods/v3 
http://www.loc.gov/standards/mods/v3/mods-3-4.xsd">
  <titleInfo>
    <title>Test title
    </title>
  </titleInfo>
  <subject authority="naf">
    <geographic>Geo subject</geographic>
  </subject>
  <location>
    <physicalLocation>Location here</physicalLocation>
  </location>
  <originInfo>
    <dateCreated keyDate="yes">1904-01-05</dateCreated><dateCreated/>
  </originInfo>
  <typeOfResource>text</typeOfResource>
  <genre authority="aat" valueURI="300026880">correspondence</genre>
  <physicalDescription>
     <extent>3 pages.</extent>
     <note type="physical description">All pages ripped down the 
     middle. 
     </note>
  </physicalDescription>
  <relatedItem type="host" displayLabel="Collection" 
    <titleInfo>
      <title>Collection name</title>
    </titleInfo>
  </relatedItem>
  <accessCondition type="use and reproduction" displayLabel="Use and 
  Reproduction">Access condition here</accessCondition>
  <identifier type="local">IDID</identifier>
</mods>

Используя следующий XSLT, в результирующий XML-документ выводятся только литеральные значения в XSLT (originInfo, accessCondition).Я не могу понять, почему это так.Когда я удаляю всю информацию заголовка из исходного XML, преобразование работает.Но все мои XML-файлы имеют этот заголовок, и я хочу, чтобы XSLT работал с ним, - я предполагаю, что мои объявления пространства имен противоречат друг другу, но я не могу понять, почему.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xlink="https://www.w3.org/1999/xlink" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:mods="http://www.loc.gov/mods/v3" version="2.0" exclude- 
result-prefixes="mods">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <mods>
        <xsl:copy-of select="mods/titleInfo"/>
        <xsl:copy-of select="mods/typeOfResource"/>
        <xsl:copy-of select="mods/location"/>
        <xsl:copy-of select="mods/physicalDescription"/>
        <xsl:copy-of select="mods/subject"/>
        <xsl:copy-of select="mods/name"/>
        <xsl:copy-of select="mods/identifier"/>
        <xsl:copy-of select="mods/genre"/>
        <xsl:copy-of select="mods/relatedItem"/>
        <xsl:copy-of select="mods/accessCondition"/>
        <xsl:copy-of select="mods/language"/>
        <xsl:copy-of select="mods/abstract"/>
        <xsl:copy-of select="mods/note"/>
        <originInfo>
            <dateCreated>
              <xsl:value-of select="mods/originInfo/dateCreated"/> 
            </dateCreated>
            <dateCreated encoding="w3cdtf" keyDate="yes" 
            point="start">
              <xsl:value-of select="mods/originInfo/dateCreated"/>
            </dateCreated> 
        </originInfo>
        <accessCondition type="use and reproduction">
            <xsl:text>Copyright statement here</xsl:text>
        </accessCondition>
    </mods>         

</xsl:template>

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

 <?xml version="1.0" encoding="UTF-8"?>
    <mods xmlns="http://www.loc.gov/mods/v3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:mods="http://www.loc.gov/mods/v3"
    xsi:schemaLocation="http://www.loc.gov/mods/v3 
    http://www.loc.gov/standards/mods/v3/mods-3-4.xsd">
      <titleInfo>
        <title>Test title
        </title>
      </titleInfo>
      <subject authority="naf">
        <geographic>Geo subject</geographic>
      </subject>
      <location>
        <physicalLocation>Location here</physicalLocation>
      </location>
      <typeOfResource>text</typeOfResource>
      <genre authority="aat" valueURI="300026880">correspondence</genre>
      <physicalDescription>
         <extent>3 pages.</extent>
         <note type="physical description">All pages ripped down the 
         middle. 
         </note>
      </physicalDescription>
      <relatedItem type="host" displayLabel="Collection" 
        <titleInfo>
          <title>Collection name</title>
        </titleInfo>
      </relatedItem>
      <accessCondition type="use and reproduction" displayLabel="Use and 
      Reproduction">Access condition here</accessCondition>
      <identifier type="local">IDID</identifier>
<originInfo>
      <dateCreated>1904-01-05 </dateCreated>
      <dateCreated encoding="w3cdtf" keyDate="yes" point="start">1904-01-05 </dateCreated>
   </originInfo>
   <accessCondition type="use and reproduction">Copyright statement here</accessCondition>
</mods>

1 Ответ

0 голосов
/ 28 декабря 2018

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

  1. Он ничего не выбирает во вводе XML, потому что ваш ввод XML помещает свои узлы в пространство имен .Если вы используете XSLT 2.0, вы можете решить эту проблему, включив xpath-default-namespace="http://www.loc.gov/mods/v3" в открывающий тег xsl:stylesheet.

  2. Он не помещает буквенные элементы результата в целевое пространство имен.Для этого необходимо объявить целевое пространство имен в качестве пространства имен по умолчанию в одном из узлов верхнего уровня, например, включив xmlns="http://www.loc.gov/mods/v3" в открывающий тег xsl:stylesheet.

Кроме того, чтобы предотвратить репликацию исходных объявлений пространства имен на каждый элемент, скопированный вашей таблицей стилей, было бы неплохо заменить буквальный элемент результата <mods> на копию исходного.

Вотполная таблица стилей, включающая следующие изменения:

XSLT 2.0

<xsl:stylesheet  version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.loc.gov/mods/v3"
xpath-default-namespace="http://www.loc.gov/mods/v3">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/mods">
    <xsl:copy>
        <xsl:copy-of select="titleInfo"/>
        <xsl:copy-of select="typeOfResource"/>
        <xsl:copy-of select="location"/>
        <xsl:copy-of select="physicalDescription"/>
        <xsl:copy-of select="subject"/>
        <xsl:copy-of select="name"/>
        <xsl:copy-of select="identifier"/>
        <xsl:copy-of select="genre"/>
        <xsl:copy-of select="relatedItem"/>
        <xsl:copy-of select="accessCondition"/>
        <xsl:copy-of select="language"/>
        <xsl:copy-of select="abstract"/>
        <xsl:copy-of select="note"/>
        <originInfo>
            <dateCreated>
              <xsl:value-of select="originInfo/dateCreated"/> 
            </dateCreated>
            <dateCreated encoding="w3cdtf" keyDate="yes" point="start">
              <xsl:value-of select="originInfo/dateCreated"/>
            </dateCreated> 
        </originInfo>
        <accessCondition type="use and reproduction">
            <xsl:text>Copyright statement here</xsl:text>
        </accessCondition>
    </xsl:copy>        
</xsl:template>

</xsl:stylesheet>

Демо : http://xsltransform.hikmatu.com/gWmuiHV

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