私はこれを行うための最良の(効率的な)方法を見つけようとしています。
中サイズのXMLドキュメントがあります。特定の設定に応じて、セキュリティ上の理由から、その特定の部分を除外する必要があります。
XSLTは構成可能であり、コードを変更する必要がないため、これをXSLTで実行します。
私は周りを見回しましたが、あまり運が良くありません。
例えば:
私は次のXPathを持っています:
//*[@root='2.16.840.1.113883.3.51.1.1.6.1']
Whicroothは、特定のOIDに等しいルート属性を持つすべてのノードを提供します。これらのノードでは、いくつか(例: fooとbar )を除くすべての属性を消去してから、別の属性(例:reason)を追加したいと思います。
また、特定の属性を持つノードに関して、特定のノードでゼロダウンし、同様の方法でその内容をクリアするために実行できる複数のXPath式が必要です。
私は以下からの情報で遊んでいます:
特定のリストを除くすべてのXML子ノードを選択するXPath式?
XSLパラメータごとに名前で要素や属性を削除します
これまでに行ったことにアクセスできるようになり次第、更新されます。
例:
変換前のXML。 UPdate:拡張機能を除外してから、その拡張機能属性の値と一致するドキュメント内のすべての値を除外します。
<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>