Извлечение части XML, указав без префикса пространства имен в xslt - PullRequest
2 голосов
/ 04 января 2011

один с префиксом пространства имен с 'emp'

<?xml version="1.0" encoding="UTF-8"?>
<emp:Employees xmlns:emp="http://www.xyz.com">
    <emp:EmployeeDetails>
        <emp:EmployeeCompanyDetails>
            <emp:CompanyName>XYZ</emp:CompanyName>
            <emp:Desgination>Engineer</emp:Desgination>
            <emp:YearOfExp>8</emp:YearOfExp>
            <emp:Department>HR</emp:Department>
            <emp:ProjectDetails>
                <emp:ProjectName>ABC</emp:ProjectName>
                <emp:Client>ZZZ</emp:Client>
                <emp:Manager>MMMM</emp:Manager>
            </emp:ProjectDetails>
        </emp:EmployeeCompanyDetails>
    </emp:EmployeeDetails>
</emp:Employees>

и другие без префикса пространства имен.

<emp:Employees xmlns:emp="http://www.xyz.com">
    <EmployeeDetails>
        <EmployeeCompanyDetails>
            <CompanyName>XYZ</CompanyName>
            <Desgination>Engineer</Desgination>
            <YearOfExp>8</YearOfExp>
            <Department>HR</Department>
            <ProjectDetails>
                <ProjectName>ABC</ProjectName>
                <Client>ZZZ</Client>
                <Manager>MMMM</Manager>
            </ProjectDetails>
        </EmployeeCompanyDetails>
    </EmployeeDetails>
</emp:Employees>

Я написал xslt ниже, чтобы извлечь только <ProjectDetails>, для которого не определен префикс пространства имен.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:emp="http://www.xyz.com" version="1.0">
    <xsl:template match="/">
        <emp:ProjectDetails>        
            <xsl:copy-of select="*//ProjectDetails/*" /> 
            <xsl:copy>
                <!--xsl:apply-templates /-->
            </xsl:copy>
        </emp:ProjectDetails>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="ns:{local-name()}">
            <xsl:apply-templates select="@*|node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Выше xslt будет работать, если входной xml идет без префикса пространства имен. Предположим, входной XML поставляется с префиксом пространства имен emp:, тогда мне нужно изменить свой код xslt на <xsl:copy-of select="*//emp:ProjectDetails/*" />.

Мой вопрос: в любом случае мы можем написать общий xslt для извлечения части xml.

Ответы [ 2 ]

4 голосов
/ 04 января 2011

Вы можете использовать :

<xsl:copy-of select="//*[local-name() = 'ProjectDetails']"/>
3 голосов
/ 04 января 2011

Хорошо, с XSLT 2.0 вы можете использовать подстановочный знак select="*//*:ProjectDetails/*". А с XSLT 1.0 ничто не мешает вам использовать select="*//emp:ProjectDetails/* | *//ProjectDetails/*" или select="*//*[local-name() = 'ProjectDetails']/*". Этот подход позволяет вам обрабатывать оба вида входных документов с одним атрибутом select в вашей таблице стилей.

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