Mar*_*tra 7 xml xslt namespaces
如果您在输入XML中有一个默认命名空间,并且要完成XSLT转换,您只想在该命名空间中添加一个元素,那么您将如何做到这一点?
您是否将命名空间声明为XSLT中的默认命名空间?或者您是在XSLT中使用前缀,在XSLT中是否将所有元素都放入该命名空间?
我创建了5个选项,其中一个选项是错误的,而其他4个选项都给出了正确的结果,但我只是想知道哪种方式最好,或者即使有更好的方法?
我使用下一个XML作为所有示例的输入:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://example.org/uri/">
<element attr="test">
<one>This is an example</one>
<two>Pretty nice</two>
</element>
</data>
Run Code Online (Sandbox Code Playgroud)
选项1,2和3
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pref="http://example.org/uri/" exclude-result-prefixes="pref">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="pref:element">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
<added>Option 1</added>
<xsl:element name="added" namespace="http://example.org/uri/">Option 2</xsl:element>
<added xmlns="http://example.org/uri/">Option 3</added>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
哪个会产生:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://example.org/uri/">
<element attr="test">
<one>This is an example</one>
<two>Pretty nice</two>
</element>
<added xmlns="">Option 1</added>
<added>Option 2</added>
<added>Option 3</added>
</data>
Run Code Online (Sandbox Code Playgroud)
从上面的选项1将不会创建正确的输出,因为没有在任何地方声明默认命名空间.选项2和3将创建正确的输出,但如果我要添加多个元素,则XSLT看起来不太好,因为我需要在所有元素上添加命名空间.
看一下上面你会说:我将在XSLT中添加一个默认命名空间,就像我在选项4中那样.
选项4
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://example.org/uri/" xmlns:pref="http://example.org/uri/" exclude-result-prefixes="pref">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="pref:element">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
<added>Option 4</added>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这将产生:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://example.org/uri/">
<element attr="test">
<one>This is an example</one>
<two>Pretty nice</two>
</element>
<added>Option 4</added>
</data>
Run Code Online (Sandbox Code Playgroud)
XSLT看起来更好,因为我不必在添加到XML的每个元素上声明名称空间.不知道为什么我应该或不应该这样做?当输入XML可能有2个不同的默认命名空间时,也许我会遇到问题?所以有时候我们会与命名空间接受它xmlns="http://example.org/uri/",有时在命名空间xmlns="http://example.org/uriSecond/".
选项5
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pref="http://example.org/uri/" exclude-result-prefixes="pref">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="pref:*">
<xsl:element name="pref:{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="pref:element">
<xsl:element name="pref:{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
<pref:added>Option 5</pref:added>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
会产生:
<?xml version="1.0" encoding="UTF-8"?>
<pref:data xmlns:pref="http://example.org/uri/">
<pref:element attr="test">
<pref:one>This is an example</pref:one>
<pref:two>Pretty nice</pref:two>
</pref:element><pref:added>Option 5</pref:added>
</pref:data>
Run Code Online (Sandbox Code Playgroud)
此外,正确的结果和所有元素都会重写为带前缀的命名空间.此外,XSLT中没有声明默认名称空间.如果我现在将收到具有不同默认命名空间的第二个输入,我也可以声明这个并复制pref:具有该前缀的所有模板.
所以我真的在寻找最好的解决方案,所以我以后不会遇到任何麻烦.或者所有工作解决方案都是一个好方法,但根据问题选择你的路径?
我认为选项 4 最清楚。
如果您必须在不同模板的不同默认命名空间中添加节点,那么您可以选择 3 到 4 之间的节点,并xmlns="..."在每个模板上添加一个:
<xsl:template match="ns1:something" xmlns="urn:ns1">
<element1 />
<element2 />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
但你的最后一段总结得很好——学习所有选项并使用在每种情况下最有意义的东西。
| 归档时间: |
|
| 查看次数: |
1970 次 |
| 最近记录: |