我正在努力寻找最好(有效)的方式来做到这一点。
我有一个中等大小的 XML 文档。根据特定设置,出于安全原因,需要过滤掉其中的某些部分。
我将在 XSLT 中执行此操作,因为它是可配置的,并且不需要更改任何代码。
我环顾四周,但运气不佳。
例如:
我有以下 XPath:
//*[@root='2.16.840.1.113883.3.51.1.1.6.1']
Whicrooth 为我提供了根属性等于特定 OID 的所有节点。在这些节点中,我希望删除除少数(例如foo和bar)之外的所有属性,然后添加另一个属性(例如reason)
对于具有特定属性的节点,我还需要有多个 XPath 表达式,它们可以在特定节点上运行到零,并以类似的方式清除它的内容。
我正在玩弄来自以下方面的信息:
XPath 表达式选择除特定列表之外的所有 XML 子节点?
当我可以访问我到目前为止所做的事情时,将很快更新。
例子:
转换前的 XML。 更新:我想过滤掉扩展,然后是文档中与该扩展属性的值匹配的所有值:
<root>
<childNode>
<innerChild root="2.16.840.1.113883.3.51.1.1.6.1" extension="123" type="innerChildness"/>
<innerChildSibling/>
</childNode>
<animals>
<cat>
<name>123</name>
</cat>
</animals>
<tree/>
<water root="2.16.840.1.113883.3.51.1.1.6.1" extension="1223" type="liquidLIke"/>
</root>
后
<root>
<childNode>
<innerChild root="2.16.840.1.113883.3.51.1.1.6.1" flavor="MSK"/> <!-- filtered -->
<innerChildSibling/>
</childNode>
<animals>
<cat>
<name>****</name>
</cat> <!-- cat was filtered -->
</animals>
<tree/>
<water root="2.16.840.1.113883.3.51.1.1.6.1" flavor="MSK"/> <!-- filtered -->
</root>
我能够使用 XSLT2。
我正在尝试这个没有任何运气(对于初学者)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="OIDAttrToDelete" select="'extension'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Get all nodes for the OID -->
<xsl:template match="//*[@root='2.16.840.1.113883.3.51.1.1.6.1']">
<xsl:if test="name() = $OIDAttrToDelete">
<xsl:attribute name="nullFlavor">MSK</xsl:attribute>
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>