如何指定以xslt为目标的xml文件的名称空间?

时间:2018-10-11 18:52:01

标签: xml xslt

如果我有一个指定名称空间的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 :(得分:1)

假设您需要返回 ejb-name ejb-ref-name 元素,请考虑将诸如 doc 之类的名称空间前缀添加到您的XSLT用作对元素的引用。 XPath descendant::*用于查找嵌套在 session 中的名称。

<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>

XSLT Fiddle