Как включить информацию в заголовок xml при использовании xslt

#xml #xslt

#xml #xslt

Вопрос:

Я полный новичок, когда дело доходит до xslt, и мне нужна помощь в следующем…

Я написал xslt, который выводит то, что я хочу, за исключением заголовка. Это то, что я хочу показать:

 <etd_ms:thesis xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/"
 xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ 
                     http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  

Это то, что я получаю с моим преобразованием:

 <etd_ms:thesis 
 xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ 
                     http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">
  

Вот соответствующая часть самого преобразования:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/"
            xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ 
                                http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

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

</xsl:template>

<xsl:template match="*">
rest of code....
  

Как мне выполнить то, что я хочу. Я думал, что эта строка будет делать то, что я хочу:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/"
            xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">
  

Вот пример ввода:

 <generic_etd>
  <dc.creator>Some Person</dc.creator>
  <dc.date>2006</dc.date>
  <dc.description.abstract>Long lines of text</dc.description.abstract> 
  <dc.description.note>Masters Abstracts</dc.description.note>
  <dc.format>application/pdf</dc.format>
  <dc.format>105 p.</dc.format>
  <dc.format>2.15 MB</dc.format>
  <dc.language>eng</dc.language>
  <dc.publisher>Publisher</dc.publisher>
  <dc.subject>Ecology.</dc.subject>
  <dc.title>My awesome title.</dc.title>
</generic_etd>
  

Добавлен пример кода здесь

Но он не делает то, что я хочу. Где я ошибся?

Комментарии:

1. Должно быть, чего-то не хватает. Вы получаете xsi префикс, но не xsi объявляете пространство имен? Как выглядит ваш источник?

2. Вам необходимо включить (минимальный) пример вашего ввода. Обратите внимание, что (единственная) часть таблицы стилей, которую вы нам показываете, копирует узлы из входных данных, включая их пространства имен. Объявления пространства имен в заголовке вашей таблицы стилей здесь не играют никакой роли.

3. Добавлен входной файл в качестве примера того, что я обрабатываю.

4. Это хорошо, но результат НЕ тот, который вы нам показываете: xsltransform.net/94hvTyG

5. Я обновил пример в вашей ссылке. Я не понял, к чему вы клоните раньше.

Ответ №1:

Позвольте мне предложить следующее в качестве отправной точки для вашего преобразования:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/">

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/generic_etd">
    <etd_ms:thesis xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:apply-templates select="@*|node()"/>
    </etd_ms:thesis>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="etd_ms:{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>
  

Когда приведенное выше будет применено к вашему примеру ввода, результат будет:

 <?xml version="1.0" encoding="UTF-8"?>
<etd_ms:thesis xmlns:etd_ms="http://www.ndltd.org/standards/metadata/etdms/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ndltd.org/standards/metadata/etdms/1.0/ http://www.ndltd.org/standards/metadata/etdms/1.0/etdms.xsd">
   <etd_ms:dc.creator>Some Person</etd_ms:dc.creator>
   <etd_ms:dc.date>2006</etd_ms:dc.date>
   <etd_ms:dc.description.abstract>Long lines of text</etd_ms:dc.description.abstract>
   <etd_ms:dc.description.note>Masters Abstracts</etd_ms:dc.description.note>
   <etd_ms:dc.format>application/pdf</etd_ms:dc.format>
   <etd_ms:dc.format>105 p.</etd_ms:dc.format>
   <etd_ms:dc.format>2.15 MB</etd_ms:dc.format>
   <etd_ms:dc.language>eng</etd_ms:dc.language>
   <etd_ms:dc.publisher>Publisher</etd_ms:dc.publisher>
   <etd_ms:dc.subject>Ecology.</etd_ms:dc.subject>
   <etd_ms:dc.title>My awesome title.</etd_ms:dc.title>
</etd_ms:thesis>
  

Комментарии:

1. Спасибо, это именно то, что я искал.

2. Когда я использую это с процессором PHP XSLTProcessor, это не работает. Есть идеи?

3. @user5013 «не работает» не является хорошим описанием проблемы. В любом случае, я считаю, что это должно работать с любым процессором XSLT.