Xslt3.0 का उपयोग करके एक xml से कुछ नोड्स निकालें

Nov 23 2020

वर्तमान में मैं पहचान टेम्पलेट का उपयोग करके xslt3.0 का उपयोग करके एक xml से कुछ नोड्स को हटाने की कोशिश कर रहा हूं। लेकिन इसमें लंबे समय से प्रसंस्करण समय लग रहा है। Xslt30Transformer का उपयोग करके प्रदर्शन को बेहतर बनाने के लिए कुछ सुझाव की आवश्यकता है।

<xsl:stylesheet version="3.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/">
 <xsl:output method="xml" indent="yes"/>

 <xsl:variable name="pathexcluded" select="'CATALOG/CD1 | CATALOG/CD2 '"/>
 <xsl:variable name="changed-nodes" as="node()*" >
  <xsl:evaluate xpath="$pathexcluded" context-item="/"/> </xsl:variable> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="$changed-nodes">
</xsl:template>
</xsl:stylesheet>

जवाब

MartinHonnen Nov 23 2020 at 22:17

पिछले उदाहरण के रूप में, एक विकल्प एक स्थिर पैरामीटर और एक छाया विशेषता का उपयोग करना है:

<xsl:param name="pathexcluded" as="xs:string" static="yes" select="'CATALOG/CD1 | CATALOG/CD2 '"/>

<xsl:template _match="{$pathexcluded}"/>

आपको यह निर्धारित करने के लिए कि क्या xsl:evaluateअपराधी है हमें अनुमति देने के लिए अपनी प्रदर्शन समस्याओं पर विवरण प्रदान करना होगा । ऊपर मुख्य रूप से एक वैकल्पिक दृष्टिकोण के रूप में पोस्ट किया गया है, अपने आप को परीक्षण करें कि क्या यह आपके उपयोग के मामलों के साथ बेहतर प्रदर्शन करता है। सरल के साथ आपका उदाहरण xsl:variableयह भी स्पष्ट नहीं करता है कि क्या वह परिवर्तनशील है या नहीं जब भी आप परिवर्तन चलाते हैं।

BTW: XSLT 3 में आप <xsl:mode on-no-match="shallow-copy"/>पहचान टेम्पलेट स्थापित करने के बजाय घोषित कर सकते हैं ।

MichaelKay Nov 23 2020 at 22:39

एक प्रदर्शन प्रश्न वास्तव में केवल तभी समझ में आता है जब आप इसे मात्रा दे सकते हैं: स्रोत दस्तावेज़ का आकार क्या है, कितना समय लग रहा है, यह आपके प्रदर्शन की आवश्यकता की तुलना कैसे करता है?

मैं नहीं देख सकता कि आप xsl:evaluateयहां क्यों प्रयोग कर रहे हैं, यह देखते हुए कि पथ अभिव्यक्ति निश्चित है। शायद यह आपके वास्तविक कोड में तय नहीं है? लेकिन, यदि यह आपका वास्तविक कोड नहीं है, तो शायद आपने हमें समस्या का वास्तविक स्रोत नहीं दिखाया है? निश्चित रूप से अगर यह एक बड़ा स्रोत दस्तावेज है और आप केवल xsl का मूल्यांकन कर रहे हैं: एक बार मूल्यांकन करें, तो यह परेशानी का कारण होने की संभावना नहीं है।

<xsl:template match="$changed-nodes"/>हो सकता है अच्छी तरह से एक समस्या हो, तो $changed-nodesएक बहुत बड़ी नोड सेट है। मुझे लग रहा है कि हमने इसे संबोधित करने के लिए हाल ही में कुछ काम किया है: आपने यह नहीं कहा है कि आप कौन सा सैक्सन रिलीज कर रहे हैं। लेकिन यहां तक ​​कि उन सुधारों के साथ, प्रत्येक नोड का परीक्षण यह देखने के लिए कि क्या यह विलोपन के मानदंडों से मेल खाता है, ऐसे सभी नोड्स के सेट को बनाने से बेहतर है और फिर प्रत्येक नोड का परीक्षण करके देखें कि यह उस सेट का सदस्य है या नहीं।