/ / XSLT निम्न प्रकार की XML संरचना से सभी लेकिन कुछ निश्चित नोड्स को हटाने के लिए - xml, xslt

एक्सएसएलटी निम्नलिखित प्रकार के एक्सएमएल संरचना से कुछ निश्चित नोड्स को हटाने के लिए - xml, xslt

<Rootnode>
<Properties Attribute ="xxx">
<Type>1</Type>
<Size>10</Size>
</Properties>
<Other>
<blah>h</blah>
</Other>
<Other2>
<blah>h</blah>
</Other2>
<Properties Attribute ="xxx">
<xType>5</xType>
<xSize>10</xSize>
</Properties>
<Items>
<Item4>8</Item4>
</Items>
<Items>
<Item6>8</Item6>
</Items>
<Properties Attribute ="xxx">
<zType>1</zType>
<zSize>10</zSize>
</Properties>
<Items place="UK">
<Item1>8</Item1>
</Items>
</Rootnode>

अब जो मैं चाहता हूं वह केवल गुणों को शामिल करना हैऔर आइटम। गुण और आइटम समूहों में शामिल होने के लिए अधिमानतः अगर गुण एक ही नाम और मूल्य हैं और गुण और गुण दोनों गुणों के आधार पर और दोनों वर्णमाला के बच्चे के नोड्स को सॉर्ट करने के लिए। अब तक मैं "एक रिक्त स्थान पर पहुँच गया हूँ;"

आवश्यक उत्पादन बहुत अधिक के रूप में ABach दिखाया गया है। यद्यपि एक बात जिसका मैं उल्लेख करना भूल गया, वह यह है कि प्रत्येक गुण या आइटम पर अन्य विशेषताएँ हो सकती हैं और मुझे पता है कि मैं जिस विशेषता को छांटना चाहता हूं उसका नाम है। कि मैं आसानी से पर्याप्त संशोधन कर सकता हूं।

यानी, आवश्यक उत्पादन

<?xml version="1.0"?>
<Rootnode>
<Properties Attribute="xxx">
<Size>10</Size>
<Type>1</Type>
<xSize>10</xSize>
<xType>5</xType>
<zSize>10</zSize>
<zType>1</zType>
</Properties>
<Items>
<Item4>8</Item4>
<Item6>8</Item6>
</Items>
<Items place="UK">
<Item1>8</Item1>
</Items>
</Rootnode>

और मेरे प्रयासों की कमी के लिए क्षमा याचना ... मैं एक सही गड़बड़ में समाप्त हो गया और यह "टी लगता है कि यह बहुत मदद मिलेगी ... मैं इस सामान के लिए बहुत नया हूँ :)

उत्तर:

जवाब के लिए 2 № 1

जैसा कि पहले से ही @LarsH द्वारा बताया गया है, हमें अपेक्षित आउटपुट XML नहीं दिखा कर, हम "यह अनुमान लगाने के लिए बचे हैं कि आप वास्तव में क्या चाहते हैं। उन्होंने कहा, यहाँ XSLT 1.0 समाधान में मेरा प्रयास है।

जब यह XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:key
name="PropertiesByAttributeNameVal"
match="Properties"
use="concat(name(@*[1]), "+", @*[1])" />

<xsl:key
name="ItemsByAttributeNameVal"
match="Items"
use="concat(name(@*[1]), "+", @*[1])" />

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="Rootnode">
<Rootnode>
<xsl:apply-templates
select="Properties[
generate-id() =
generate-id(key(
"PropertiesByAttributeNameVal",
concat(name(@*[1]), "+", @*[1]))[1])]">
<xsl:with-param name="pKeyName"
select=""PropertiesByAttributeNameVal"" />
<xsl:sort select="concat(name(@*[1]), "+", @*[1])" />
</xsl:apply-templates>
<xsl:apply-templates
select="Items[
generate-id() =
generate-id(key(
"ItemsByAttributeNameVal",
concat(name(@*[1]), "+", @*[1]))[1])]">
<xsl:with-param name="pKeyName"
select=""ItemsByAttributeNameVal"" />
<xsl:sort select="concat(name(@*[1]), "+", @*[1])" />
</xsl:apply-templates>
</Rootnode>
</xsl:template>

<xsl:template match="Properties|Items">
<xsl:param name="pKeyName" />
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates
select="key($pKeyName, concat(name(@*[1]), "+", @*[1]))/*">
<xsl:sort select="name()" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

... दिए गए XML के खिलाफ रन:

<Rootnode>
<Properties Attribute="xxx">
<Type>1</Type>
<Size>10</Size>
</Properties>
<Other>
<blah>h</blah>
</Other>
<Other2>
<blah>h</blah>
</Other2>
<Properties Attribute="xxx">
<xType>5</xType>
<xSize>10</xSize>
</Properties>
<Items>
<Item4>8</Item4>
</Items>
<Items>
<Item6>8</Item6>
</Items>
<Properties Attribute="xxx">
<zType>1</zType>
<zSize>10</zSize>
</Properties>
<Items place="UK">
<Item1>8</Item1>
</Items>
</Rootnode>

... मुझे लगता है कि सही उत्पादन XML का उत्पादन होता है:

<?xml version="1.0"?>
<Rootnode>
<Properties Attribute="xxx">
<Size>10</Size>
<Type>1</Type>
<xSize>10</xSize>
<xType>5</xType>
<zSize>10</zSize>
<zType>1</zType>
</Properties>
<Items>
<Item4>8</Item4>
<Item6>8</Item6>
</Items>
<Items place="UK">
<Item1>8</Item1>
</Items>
</Rootnode>

ध्यान दें कि यदि यह वही XSLT थोड़ा संशोधित XML दस्तावेज़ (जिसमें अधिक समूहन, आदि है) के विरुद्ध चलाया जाता है:

<?xml version="1.0" encoding="utf-8"?>
<Rootnode>
<Properties Attribute="xxx">
<Type>1</Type>
<Size>10</Size>
</Properties>
<Other>
<blah>h</blah>
</Other>
<Other2>
<blah>h</blah>
</Other2>
<Properties Attribute="yyy">
<xType>5</xType>
<xSize>10</xSize>
</Properties>
<Items>
<Item4>8</Item4>
</Items>
<Items place="US">
<Item9>8</Item9>
</Items>
<Items>
<Item1>8</Item1>
</Items>
<Properties Attribute2="xxx">
<zType>1</zType>
<zSize>10</zSize>
</Properties>
<Properties Attribute="xxx">
<elephantType>5</elephantType>
<elephantSize>15</elephantSize>
</Properties>
<Items place="UK">
<Item1>8</Item1>
</Items>
</Rootnode>

... फिर, मुझे लगता है कि सही उत्तर का उत्पादन होता है:

<?xml version="1.0"?>
<Rootnode>
<Properties Attribute="xxx">
<Size>10</Size>
<Type>1</Type>
<elephantSize>15</elephantSize>
<elephantType>5</elephantType>
</Properties>
<Properties Attribute="yyy">
<xSize>10</xSize>
<xType>5</xType>
</Properties>
<Properties Attribute2="xxx">
<zSize>10</zSize>
<zType>1</zType>
</Properties>
<Items>
<Item1>8</Item1>
<Item4>8</Item4>
</Items>
<Items place="UK">
<Item1>8</Item1>
</Items>
<Items place="US">
<Item9>8</Item9>
</Items>
</Rootnode>

मान्यताओं:

  • मुझे लगता है कि प्रत्येक <Properties> तथा <Items> तत्व में केवल एक विशेषता है और यह समूह निर्धारण निर्धारक होना चाहिए।
  • यदि उपरोक्त सच नहीं है, तो बहुत कम से कम, मैं मानता हूं कि उस तत्व की पहली विशेषता समूह निर्धारणकर्ता होनी चाहिए।

स्पष्टीकरण:

  1. क्योंकि यह एक XSLT 1.0 समाधान है, Muenchian Grouping अद्वितीय चयनकर्ताओं के तहत नोड्स और विशेषताओं को समूहीकृत करने के दिन का क्रम है; इसलिए, हम दो कुंजी परिभाषित करते हैं: एक के लिए <Properties> तत्वों और एक के लिए <Items> तत्वों।

  2. पहला टेम्प्लेट है Identity Transform - इसका काम स्रोत दस्तावेज़ से सभी नोड्स और विशेषताओं को आउटपुट दस्तावेज़ में परिणाम के रूप में करना है।

  3. दूसरा टेम्पलेट मेल खाता है <Rootnode> तत्व। यह केवल उन लोगों के लिए टेम्पलेट लागू करने के लिए निर्देश दिया जाता है <Properties> तथा <Items> ऐसे तत्व जो पहली बार अपनी संबंधित कुंजियों में दिखाई देते हैं; इसमें केवल अद्वितीय तत्वों को संसाधित करने का उद्देश्य है (उनके पहले गुण के नाम और मूल्य के आधार पर)।

    जब <xsl:apply-templates> तत्व निर्दिष्ट किया गया है, ध्यान दें कि दोनों उदाहरणों में, उसी गुण नाम / मान युग्म द्वारा परिणामों को क्रमबद्ध करने का निर्देश दिया गया है।

    ध्यान दें कि प्रत्येक <xsl:apply-templates> तत्व को एक पैरामीटर दिया जाता है (के माध्यम से <xsl:with-param>)। जैसा कि आप देखेंगे, दोनों को संसाधित करने के लिए कोड <Properties> तथा <Items> तत्व लगभग समान हैं; एकमात्र अंतरवह कुंजी है जिससे हम परिणाम प्राप्त करते हैं। इस वजह से, मैंने उस तर्क को तीसरे टेम्पलेट में समेकित करने और इस पैरामीटर के माध्यम से परिवर्तनशीलता के लिए खाता चुना।

  4. तीसरा टेम्पलेट दोनों से मेल खाता है <Properties> तथा <Items> तत्वों। प्रत्येक के लिए, मूल नोड की प्रतिलिपि बनाई गई है (जैसा कि इसके गुण हैं)। अंत में, इस तत्व के सभी बाल तत्वों के खिलाफ टेम्पलेट लागू किए जाते हैं (उचित छँटाई के साथ [इस बार, बाल तत्व के नाम के आधार पर]]।


उत्तर № 2 के लिए 1

यदि आपके पास पहले से ही कुछ नहीं है, तो आपको सहायता प्राप्त करने की अधिक संभावना होगी। आरंभ करने के लिए, एक टेम्प्लेट बनाएं जो गुण और आइटम से मेल खाता हो (match="Properties | Items") जिसकी सामग्री केवल मिलान किए गए तत्व की प्रतिलिपि बनाती है: <xsl:copy-of select="." />.

यह आपको दिखाने के लिए कुछ काम कोड देगा।

अगला चरण मैं सुझाऊंगा कि वांछित आउटपुट का एक नमूना पोस्ट कर रहा है, और आपके एक्सएसएलटी कोड द्वारा दिया गया वास्तविक आउटपुट।

यह आपके प्रश्न का उत्तर देने में लोगों को पुल करने के लिए बहुत छोटा अंतर प्रदान करेगा।