Можно ли игнорировать namespace без префикса, не удаляя его из исходного xml?
есть xml файл:
<?xml version="1.0" encoding="UTF-8"?>
<request
xmlns="http://www.ucbreport.ru/2021/UCH"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
schemaVersion="1.0"
xsi:schemaLocation="http://www.ucbreport.ru/2021/UCH UCH758Report.xsd">
<person>
<name>
<firstName>test</firstName>
<lastName>test</lastName>
<midName>test</midName>
</name>
<prevName/>
<birthInfo>
<birthDate>20.07.2001</birthDate>
<countryCode>643</countryCode>
<birthPlace>test</birthPlace>
</birthInfo>
<id>
<countryCode>643</countryCode>
<idCode>21</idCode>
<idSeries>1111</idSeries>
<idNum>111111</idNum>
<issueDate>23.08.2021</issueDate>
<issuer>test</issuer>
<deptCode>111-222</deptCode>
</id>
<prevId/>
</person>
<consent>
<givenTo>
<org>
<name>
<fullName>test</fullName>
<shortName>-</shortName>
</name>
<regNum>123</regNum>
</org>
</givenTo>
<hashCode>123qwe123</hashCode>
<date>17.04.2023</date>
<expireCode>1</expireCode>
<requestReason>3</requestReason>
<accountabilityAcknowledged>1</accountabilityAcknowledged>
</consent>
<requestInfo>
<requestReason>3</requestReason>
<amount>1000,00</amount>
<currency>RUB</currency>
</requestInfo>
</request>
А так же xslt преобразование
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"
indent="no"
omit-xml-declaration="yes"
encoding="UTF-8"/>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/">
<xsl:text>firstName=</xsl:text>
<xsl:value-of select="/request/person/name/firstName"/>
<xsl:text>;</xsl:text>
<xsl:text>lastName=</xsl:text>
<xsl:value-of select="/request/person/name/lastName"/>
<xsl:text>;</xsl:text>
<xsl:text>midName=</xsl:text>
<xsl:value-of select="/request/person/name/midName"/>
<xsl:text>;</xsl:text>
<xsl:text>birthDate=</xsl:text>
<xsl:value-of select="/request/person/birthInfo/birthDate"/>
<xsl:text>;</xsl:text>
<xsl:text>idSeries=</xsl:text>
<xsl:value-of select="/request/person/id/idSeries"/>
<xsl:text>;</xsl:text>
<xsl:text>idNum=</xsl:text>
<xsl:value-of select="/request/person/id/idNum"/>
<xsl:text>;</xsl:text>
</xsl:template>
</xsl:stylesheet>
При наложении преобразования на xml файл в итоге получается пустой ответ, ошибка в строке xmlns="http://www.ucbreport.ru/2021/UCH" в xml файле, но удалять его нельзя, так как он требуется в других операциях, с помощью преобразования нужно просто вытянуть требуемые данные из файла.
Как это сделать, не трогая пространства имён?
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Невозможно игнорировать пространство имен по умолчанию. И не надо этого делать.
В XSLT 2.0 для этого было введено предложение 'xpath-default-namespace'.
Входной XML
<?xml version="1.0" encoding="UTF-8"?>
<request xmlns="http://www.ucbreport.ru/2021/UCH" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.0" xsi:schemaLocation="http://www.ucbreport.ru/2021/UCH UCH758Report.xsd">
<person>
<name>
<firstName>test</firstName>
<lastName>test</lastName>
<midName>test</midName>
</name>
<prevName/>
<birthInfo>
<birthDate>20.07.2001</birthDate>
<countryCode>643</countryCode>
<birthPlace>test</birthPlace>
</birthInfo>
<id>
<countryCode>643</countryCode>
<idCode>21</idCode>
<idSeries>1111</idSeries>
<idNum>111111</idNum>
<issueDate>23.08.2021</issueDate>
<issuer>test</issuer>
<deptCode>111-222</deptCode>
</id>
<prevId/>
</person>
<consent>
<givenTo>
<org>
<name>
<fullName>test</fullName>
<shortName>-</shortName>
</name>
<regNum>123</regNum>
</org>
</givenTo>
<hashCode>123qwe123</hashCode>
<date>17.04.2023</date>
<expireCode>1</expireCode>
<requestReason>3</requestReason>
<accountabilityAcknowledged>1</accountabilityAcknowledged>
</consent>
<requestInfo>
<requestReason>3</requestReason>
<amount>1000,00</amount>
<currency>RUB</currency>
</requestInfo>
</request>
XSLT 2.0
<?xml version='1.0'?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.ucbreport.ru/2021/UCH">
<xsl:output method="text"
indent="no"
omit-xml-declaration="yes"
encoding="UTF-8"/>
<xsl:template match="/request">
<xsl:text>firstName=</xsl:text>
<xsl:value-of select="person/name/firstName"/>
<xsl:text>;</xsl:text>
<xsl:text>lastName=</xsl:text>
<xsl:value-of select="person/name/lastName"/>
<xsl:text>;</xsl:text>
<xsl:text>midName=</xsl:text>
<xsl:value-of select="person/name/midName"/>
<xsl:text>;</xsl:text>
<xsl:text>birthDate=</xsl:text>
<xsl:value-of select="person/birthInfo/birthDate"/>
<xsl:text>;</xsl:text>
<xsl:text>idSeries=</xsl:text>
<xsl:value-of select="person/id/idSeries"/>
<xsl:text>;</xsl:text>
<xsl:text>idNum=</xsl:text>
<xsl:value-of select="person/id/idNum"/>
<xsl:text>;</xsl:text>
</xsl:template>
</xsl:stylesheet>
Результат
firstName=test;lastName=test;midName=test;birthDate=20.07.2001;idSeries=1111;idNum=111111;
Другой вариант XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.ucbreport.ru/2021/UCH">
<xsl:output method="text" indent="no" omit-xml-declaration="yes"
encoding="UTF-8"/>
<xsl:template match="/request">
<xsl:for-each select="person/*/*">
<xsl:value-of select="concat(local-name(),'=', .,';')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>