Как мне указать пространство имен xml-файла, на которое нацелен xslt? - PullRequest
0 голосов
/ 11 октября 2018

Если бы у меня был файл XML, в котором указано пространство имен, например

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
         version="3.1">
    <enterprise-beans>
        <session>
            <ejb-name>Manager</ejb-name>
            <ejb-class>com.something.ManagerBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
            <ejb-local-ref>
                <ejb-ref-name>Manager</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <local-home>com.something.ManagerLocalHome</local-home>
                <local>com.something.ManagerLocal</local>
                <ejb-link>Manager</ejb-link>
            </ejb-local-ref>
        </session>
    </enterprise-beans>
</ejb-jar>

И я хотел бы извлечь только имена с помощью XSLT, например,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://java.sun.com/xml/ns/javaee"
                version="1.0"
>
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/ejb-jar/enterprise-beans/session">
        <session>
            <xsl:value-of select="ejb-name"/>
        </session>
    </xsl:template>
</xsl:stylesheet>

Чтоя скучаю?Это преобразование, похоже, сработает, если я удалю xmlns источника - как я могу оставить его включенным и все еще запустить преобразование?

Я ожидал что-то вроде:

<session>
  Manager
</session>
<session>
  Manager2
</session>
...

(На самом деле простопытаясь выяснить проблему с пространством имен)

1 Ответ

0 голосов
/ 11 октября 2018

Если вам необходимо вернуть элементы ejb-name и ejb-ref-name , рассмотрите возможность добавления префикса пространства имен, например doc , в XSLT для использованиякак ссылка на элементы.XPath descendant::* используется для поиска имен, вложенных в сеанс .

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:doc="http://java.sun.com/xml/ns/javaee"
                exclude-result-prefixes="doc"
                version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/doc:ejb-jar/doc:enterprise-beans">
        <session>
            <xsl:apply-templates select="doc:session"/>
        </session>
    </xsl:template>

    <xsl:template match="doc:session">
        <name><xsl:value-of select="descendant::doc:ejb-name"/></name>
        <name><xsl:value-of select="descendant::doc:ejb-ref-name"/></name>
    </xsl:template>

</xsl:stylesheet>

Выход

<session>
  <name>Manager</name>
  <name>Manager</name>
</session>

XSLTFiddle

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