Я выполняю преобразование идентичности 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>
Можете ли вы опубликовать вывод, который вы получаете, и указать, какие атрибуты у вас есть? –
привет Колин Д, я добавил дополнительные примеры. Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию! Благодаря! – CanOfBees
Я считаю, что проблема 'exclude-result-prefixes =" # all "' - это только список префиксов, которые вы действительно хотите исключить. – biziclop