2012-04-16 6 views
0

Я выполняю преобразование идентичности XSLT 2.0 на некоторых XML-документах EAD (закодированное архивное описание). Мне нужно немного изменить результат, но я, похоже, сталкиваюсь с проблемой пространства имен.Пространство имен XSLT предотвращает преобразование идентичности с изменениями в выходе

Не тестируйте это в процессоре с поддержкой схемы, вы получите ошибки! :)

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="#all" 
version="2.0"> 

<xsl:output method="xml" indent="yes" standalone="no"/> 

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

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

Sample-EAD.xml (также доступен на Pastebin здесь: http://pastebin.com/RFAQaY3w)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"  xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b"> 
<eadid></eadid> 
<filedesc> 
    <AAA>1</AAA> 
    <BBB>2</BBB> 
</filedesc> 
</eadheader> 
<archdesc> 
    <bib> 
     <CCC>1</CCC> 
     <DDD>2</DDD> 
    </bib> 
</archdesc> 
</ead> 

Если я вытаскивать информацию пространства имен из элемента , (также доступно здесь: http://pastebin.com/6ygi3xUm) работает преобразование идентичности с изменениями.

Sample-EAD-2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ead> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b"> 
<eadid></eadid> 
<filedesc> 
    <AAA>1</AAA> 
    <BBB>2</BBB> 
</filedesc> 
</eadheader> 
<archdesc> 
    <bib> 
     <CCC>1</CCC> 
     <DDD>2</DDD> 
    </bib> 
</archdesc> 

Я не очень хорошо с пространствами имен, так что любые советы будут оценены. Если я попробую добавить пространства имен в XSLT, это будет работать, но я получаю атрибуты пространства имен в новых элементах. Большое спасибо за чтение & ваших предложений! Приветствия!

EDIT: вход (ж/пространств имен), проходят через преобразование идентичности результат -

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" 
      countryencoding="iso3166-1" 
      dateencoding="iso8601" 
      langencoding="iso639-2b"> 
    <eadid></eadid> 
    <filedesc> 
      <AAA>1</AAA> 
      <BBB>2</BBB> 
    </filedesc> 
    </eadheader> 
    <archdesc> 
     <bib> 
       <CCC>1</CCC> 
       <DDD>2</DDD> 
     </bib> 
    </archdesc> 
</ead> 

вход (ж/о пространствах имен) проходят через тождественное преобразование результатов -

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ead> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" 
      countryencoding="iso3166-1" 
      dateencoding="iso8601" 
      langencoding="iso639-2b"> 
    <eadid></eadid> 
    <filedesc> 
    <header>Subjects</header> 
      <AAA>1</AAA> 
      <BBB>2</BBB> 
    </filedesc> 
    </eadheader> 
    <archdesc> 
     <bib> 
       <CCC>1</CCC> 
       <DDD>2</DDD> 
     </bib> 
    </archdesc> 

и, наконец, ввод (с пространством имен) проходит через XSLT (с добавленными пространствами имен) -

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="#all" 
version="2.0" 
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd" 
xmlns:ns2="http://www.w3.org/1999/xlink" 
xmlns="urn:isbn:1-931666-22-9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<xsl:output method="xml" indent="yes" standalone="no"/> 

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

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

</xsl:stylesheet> 

Результаты:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" 
      countryencoding="iso3166-1" 
      dateencoding="iso8601" 
      langencoding="iso639-2b"> 
    <eadid></eadid> 
    <filedesc> 
      <AAA>1</AAA> 
      <BBB>2</BBB> 
    </filedesc> 
    </eadheader> 
    <archdesc> 
     <bib> 
       <CCC>1</CCC> 
       <DDD>2</DDD> 
     </bib> 
    </archdesc> 
</ead> 

EDIT # 2: Извинения, все, как я думаю, что я не в состоянии выразить желаемый результат. Я хотел бы избежать дополнительных атрибутов в модифицированных элементах, поскольку дополнительная обработка будет выполняться после преобразования идентификатора, и я хотел бы сохранить XML как можно ближе к его текущему состоянию (за исключением изменений). Еще раз спасибо за ваше терпение & помощь! Вот пример:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b"> 
    <eadid></eadid> 
    <filedesc> 
     <header>List Name</header> 
     <AAA>1</AAA> 
     <BBB>2</BBB> 
    </filedesc> 
</eadheader> 
<archdesc> 
    <bib> 
     <CCC>1</CCC> 
     <DDD>2</DDD> 
    </bib> 
</archdesc> 
</ead> 
+1

Можете ли вы опубликовать вывод, который вы получаете, и указать, какие атрибуты у вас есть? –

+0

привет Колин Д, я добавил дополнительные примеры. Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию! Благодаря! – CanOfBees

+0

Я считаю, что проблема 'exclude-result-prefixes =" # all "' - это только список префиксов, которые вы действительно хотите исключить. – biziclop

ответ

0

Это очень длинный вопрос и немного трудно следовать, но я думаю, что это то, что вы хотите. Дело в том, что элемент, который вы хотите сопоставить, находится в пространстве имен в исходном XML-документе, поэтому вам также нужно сопоставить пространство имен. Таким образом, я назначил ему префикс в xslt: xmlns:input="urn:isbn:1-931666-22-9". Затем я использую его для соответствия элементу filedesc: <xsl:template match="input:filedesc">. Я также создаю такое же пространство имен как пространство имен по умолчанию для xsl, чтобы ваш элемент находился в этом пространстве имен.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:input="urn:isbn:1-931666-22-9" 
    xmlns="urn:isbn:1-931666-22-9" 
    exclude-result-prefixes="input" 
    version="2.0"> 

    <xsl:output method="xml" indent="yes" standalone="no"/> 

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

    <xsl:template match="input:filedesc"> 
    <xsl:copy> 
     <header>Subjects</header> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

привет Дэвиду - спасибо за ответ. Я получил аналогичный ответ через другой справочный форум. Я очень ценю помощь! Ура! – CanOfBees

Смежные вопросы