我有一个需要生成另一个xml的xml和xsl,但是由于&x; xmlns',它会生成一个空的xml。没有' xmlns'在XML的根目录中,它工作正常。以下XSL尚未完整版本。我需要更多的逻辑,但我被困在这里,因为' xmlns'。
我正在使用Java API通过此XML和XSL生成另一个XML。有人可以告诉我为什么它不能匹配元素因为xmlns以及如何修复它?
感谢。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://xmlns.company.com/config">
<subi-config>
<primary-data-source>Repository</primary-data-source>
<instance>
<name>agent1</name>
<address>localhost</address>
<port>8080</port>
<admin-username>admin</admin-username>
</instance>
</subi-config>
</config>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xmlns.company.com/config">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="config"/>
</xsl:template>
<xsl:template match="config">
<config>
<sub-config>
<primary-data-source><xsl:value-of select="sub-config/primary-data-source"/></primary-data-source>
<xsl:apply-templates select="sub-config"/>
</sub-config>
</config>
</xsl:template>
<xsl:template match="sub-config">
<xsl:for-each select="instance">
<instance>
<name><xsl:value-of select="name"/></name>
<address><xsl:value-of select="address"/></address>
<port><xsl:value-of select="port"/></port>
<admin-username><xsl:value-of select="admin-username"/></admin-username>
</instance>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:3)
您需要为命名空间分配前缀,并在寻址源XML的元素时使用该前缀:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cfg="http://xmlns.company.com/config"
exclude-result-prefixes="cfg">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="cfg:config"/>
</xsl:template>
<xsl:template match="cfg:config">
<config>
<sub-config>
<primary-data-source>
<xsl:value-of select="cfg:sub-config/cfg:primary-data-source"/>
</primary-data-source>
<xsl:apply-templates select="cfg:sub-config"/>
</sub-config>
</config>
</xsl:template>
<xsl:template match="cfg:sub-config">
<xsl:for-each select="cfg:instance">
<instance>
<name><xsl:value-of select="cfg:name"/></name>
<address><xsl:value-of select="cfg:address"/></address>
<port><xsl:value-of select="cfg:port"/></port>
<admin-username><xsl:value-of select="cfg:admin-username"/></admin-username>
</instance>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,sub-config
和subi-config
是两回事。
答案 1 :(得分:-1)
将xsl:element与namespace属性
一起使用<xsl:template match="config">
<xsl:element namespace="http://xmlns.company.com/config" name="config">
<sub-config>
<primary-data-source><xsl:value-of select="sub-config/primary-data-source"/></primary-data-source>
<xsl:apply-templates select="sub-config"/>
</sub-config>
</xsl:element>
</xsl:template>
它将创建具有计算名称的元素(对我们来说是静态)并允许添加名称空间属性