[英]how to remove namespace and retain only some of the elements from the original XML document using XSL?
下面是我的XML。 我想使用XSL对此进行解析。 我要实现的是删除名称空间(xmlns),然后仅保留一些元素及其属性。 我找到了一种删除名称空间的方法,但是当我将其与代码结合在一起以保留某些元素时,它不起作用。 我已经尝试过该身份,但仍然无法使用。
我希望外面的人可以分享一些东西。 提前非常感谢您。
XML输入:
<Transaction xmlns="http://www.test.com/rdc.xsd">
<Transaction>
<StoreName id="aa">STORE A</StoreName>
<TransNo>TXN0001</TransNo>
<RegisterNo>REG001</RegisterNo>
<Items>
<Item id="1">
<ItemID>A001</ItemID>
<ItemDesc>Keychain</ItemDesc>
</Item>
<Item id="2">
<ItemID>A002</ItemID>
<ItemDesc>Wallet</ItemDesc>
</Item>
</Items>
<IDONTLIKETHIS_1>
<STOREXXX>XXX-</STOREXXX>
<TRANSXXX>YYY</TRANSXXX>
</IDONTLIKETHIS_1>
<IDONTLIKETHIS_2>
<STOREXXX>XXX-</STOREXXX>
<TRANSXXX>YYY</TRANSXXX>
</IDONTLIKETHIS_2>
</Transaction>
<Transaction>
预期的XML输出:
<Transaction>
<Transaction>
<StoreName id="aa">STORE A</StoreName>
<TransNo>TXN0001</TransNo>
<RegisterNo>REG001</RegisterNo>
<Items>
<Item id="1">
<ItemID>A001</ItemID>
<ItemDesc>Keychain</ItemDesc>
</Item>
<Item id="2">
<ItemID>A002</ItemID>
<ItemDesc>Wallet</ItemDesc>
</Item>
</Items>
</Transaction>
<Transaction>
用于删除名称空间的代码(xmlns):
<xsl:template match="*">
<xsl:element name="{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 version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://invia.fujitsu.com/RetailDATACenter/rdc.xsd">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="node()[not(self::*)]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="x:IDONTLIKETHIS_1 | x:IDONTLIKETHIS_2"/>
</xsl:stylesheet>
说明 :
匹配“ *”的模板会匹配任何元素并使用相同的名称重新创建它 ( <xsl:element>
),但是不会复制任何名称空间节点。 它还复制该元素的所有属性。 然后,它将模板(包括自身-递归地)应用到该元素的所有子节点上-不仅是元素,还包括所有类型的子节点:元素,文本节点,处理指令和注释。
最后一个模板与我们不希望复制到输出的任何节点匹配 ,并且使用空的模板主体完全做到这一点(不复制)。
第二个模板匹配所有非元素的节点并将其复制到输出,不包括文档节点/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.