split XML node by half (XSLT transformation)
Could you please help how to split in half node with subnodes.
Input:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Output:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="hard-coded guid1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule Id="hard-coded guid2">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Unfortunatly I dont have expirience with xslt and did not find such an examples how to do it.
Updated
I tried one of the suggested approach below and have this https://xsltfiddle.liberty-development.net/jyH9rNq/3 nodes doesn't copy
xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="fileHash" select="/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
<xsl:template match="/">
<RuleCollection>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfa</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() <= $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfb</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() > $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<RuleCollection>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfa">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfb">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
</RuleCollection>
xml xslt-1.0
add a comment |
Could you please help how to split in half node with subnodes.
Input:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Output:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="hard-coded guid1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule Id="hard-coded guid2">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Unfortunatly I dont have expirience with xslt and did not find such an examples how to do it.
Updated
I tried one of the suggested approach below and have this https://xsltfiddle.liberty-development.net/jyH9rNq/3 nodes doesn't copy
xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="fileHash" select="/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
<xsl:template match="/">
<RuleCollection>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfa</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() <= $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfb</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() > $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<RuleCollection>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfa">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfb">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
</RuleCollection>
xml xslt-1.0
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
You keep changing your input XML format. Now that you have added theRuleCollection
wrapper, you must change thefileHash
variable definition to:<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4
– michael.hor257k
Nov 24 '18 at 9:01
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37
add a comment |
Could you please help how to split in half node with subnodes.
Input:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Output:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="hard-coded guid1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule Id="hard-coded guid2">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Unfortunatly I dont have expirience with xslt and did not find such an examples how to do it.
Updated
I tried one of the suggested approach below and have this https://xsltfiddle.liberty-development.net/jyH9rNq/3 nodes doesn't copy
xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="fileHash" select="/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
<xsl:template match="/">
<RuleCollection>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfa</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() <= $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfb</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() > $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<RuleCollection>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfa">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfb">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
</RuleCollection>
xml xslt-1.0
Could you please help how to split in half node with subnodes.
Input:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Output:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="hard-coded guid1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule Id="hard-coded guid2">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
Unfortunatly I dont have expirience with xslt and did not find such an examples how to do it.
Updated
I tried one of the suggested approach below and have this https://xsltfiddle.liberty-development.net/jyH9rNq/3 nodes doesn't copy
xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="fileHash" select="/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
<xsl:template match="/">
<RuleCollection>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfa</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() <= $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfb</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() > $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<RuleCollection>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfa">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfb">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
</RuleCollection>
xml xslt-1.0
xml xslt-1.0
edited Nov 24 '18 at 8:21
asked Nov 23 '18 at 11:15
Alexander
103
103
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
You keep changing your input XML format. Now that you have added theRuleCollection
wrapper, you must change thefileHash
variable definition to:<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4
– michael.hor257k
Nov 24 '18 at 9:01
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37
add a comment |
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
You keep changing your input XML format. Now that you have added theRuleCollection
wrapper, you must change thefileHash
variable definition to:<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4
– michael.hor257k
Nov 24 '18 at 9:01
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
You keep changing your input XML format. Now that you have added the
RuleCollection
wrapper, you must change the fileHash
variable definition to: <xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4– michael.hor257k
Nov 24 '18 at 9:01
You keep changing your input XML format. Now that you have added the
RuleCollection
wrapper, you must change the fileHash
variable definition to: <xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4– michael.hor257k
Nov 24 '18 at 9:01
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37
add a comment |
3 Answers
3
active
oldest
votes
You could find the half point quite simply by:
<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
Then just create the two FileHashRule
elements and use:
<xsl:copy-of select="$fileHash[position() <= $half]" />
to populate the first one, and:
<xsl:copy-of select="$fileHash[position() > $half]" />
for the second one.
add a comment |
You can start from something like (XSLT Fiddle):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//xs">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() <= last() div 2]'/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() > last() div 2]'/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
It will split
<?xml version="1.0" encoding="utf-8" ?>
<data>
<xs a="b">
<will-not-be-copied/>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
</xs>
</data>
into
<?xml version="1.0" encoding="UTF-8"?>
<data>
<xs a="b">
<x>1</x>
<x>2</x>
</xs>
<xs a="b">
<x>3</x>
<x>4</x>
</xs>
</data>
Note though, that you need to clarify how you want to deal with tags like <will-not-be-copied>
and you might want to add your id
values to the splitted <xs>
tags.
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
add a comment |
Here's one way:
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FileHashRule">
<FileHashRule Id="{@Id}">
<xsl:apply-templates mode="one"/>
</FileHashRule>
<FileHashRule Id="{@Id + 1}">
<xsl:apply-templates mode="two"/>
</FileHashRule>
</xsl:template>
<xsl:template match="FileHash[position() > last() div 2]" mode="one"/>
<xsl:template match="FileHash[position() <= last() div 2]" mode="two"/>
The first rule says: by default, copy nodes unchanged.
The second rule says: For a FileHashRule, create two copies, incrementing the @Id attribute in the second.
The third rule says: during the first phase, skip any FileHash element in the second half of the list.
The fourth rule says: during the second phase, skip any FileHash element in the first half of the list.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445663%2fsplit-xml-node-by-half-xslt-transformation%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
You could find the half point quite simply by:
<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
Then just create the two FileHashRule
elements and use:
<xsl:copy-of select="$fileHash[position() <= $half]" />
to populate the first one, and:
<xsl:copy-of select="$fileHash[position() > $half]" />
for the second one.
add a comment |
You could find the half point quite simply by:
<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
Then just create the two FileHashRule
elements and use:
<xsl:copy-of select="$fileHash[position() <= $half]" />
to populate the first one, and:
<xsl:copy-of select="$fileHash[position() > $half]" />
for the second one.
add a comment |
You could find the half point quite simply by:
<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
Then just create the two FileHashRule
elements and use:
<xsl:copy-of select="$fileHash[position() <= $half]" />
to populate the first one, and:
<xsl:copy-of select="$fileHash[position() > $half]" />
for the second one.
You could find the half point quite simply by:
<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
Then just create the two FileHashRule
elements and use:
<xsl:copy-of select="$fileHash[position() <= $half]" />
to populate the first one, and:
<xsl:copy-of select="$fileHash[position() > $half]" />
for the second one.
edited Nov 24 '18 at 9:02
answered Nov 23 '18 at 12:34
michael.hor257k
73.7k42236
73.7k42236
add a comment |
add a comment |
You can start from something like (XSLT Fiddle):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//xs">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() <= last() div 2]'/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() > last() div 2]'/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
It will split
<?xml version="1.0" encoding="utf-8" ?>
<data>
<xs a="b">
<will-not-be-copied/>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
</xs>
</data>
into
<?xml version="1.0" encoding="UTF-8"?>
<data>
<xs a="b">
<x>1</x>
<x>2</x>
</xs>
<xs a="b">
<x>3</x>
<x>4</x>
</xs>
</data>
Note though, that you need to clarify how you want to deal with tags like <will-not-be-copied>
and you might want to add your id
values to the splitted <xs>
tags.
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
add a comment |
You can start from something like (XSLT Fiddle):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//xs">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() <= last() div 2]'/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() > last() div 2]'/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
It will split
<?xml version="1.0" encoding="utf-8" ?>
<data>
<xs a="b">
<will-not-be-copied/>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
</xs>
</data>
into
<?xml version="1.0" encoding="UTF-8"?>
<data>
<xs a="b">
<x>1</x>
<x>2</x>
</xs>
<xs a="b">
<x>3</x>
<x>4</x>
</xs>
</data>
Note though, that you need to clarify how you want to deal with tags like <will-not-be-copied>
and you might want to add your id
values to the splitted <xs>
tags.
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
add a comment |
You can start from something like (XSLT Fiddle):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//xs">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() <= last() div 2]'/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() > last() div 2]'/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
It will split
<?xml version="1.0" encoding="utf-8" ?>
<data>
<xs a="b">
<will-not-be-copied/>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
</xs>
</data>
into
<?xml version="1.0" encoding="UTF-8"?>
<data>
<xs a="b">
<x>1</x>
<x>2</x>
</xs>
<xs a="b">
<x>3</x>
<x>4</x>
</xs>
</data>
Note though, that you need to clarify how you want to deal with tags like <will-not-be-copied>
and you might want to add your id
values to the splitted <xs>
tags.
You can start from something like (XSLT Fiddle):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//xs">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() <= last() div 2]'/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select='x[position() > last() div 2]'/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
It will split
<?xml version="1.0" encoding="utf-8" ?>
<data>
<xs a="b">
<will-not-be-copied/>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
</xs>
</data>
into
<?xml version="1.0" encoding="UTF-8"?>
<data>
<xs a="b">
<x>1</x>
<x>2</x>
</xs>
<xs a="b">
<x>3</x>
<x>4</x>
</xs>
</data>
Note though, that you need to clarify how you want to deal with tags like <will-not-be-copied>
and you might want to add your id
values to the splitted <xs>
tags.
answered Nov 23 '18 at 12:32
Micha Wiedenmann
10.3k1364103
10.3k1364103
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
add a comment |
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
Your wrappers are identical - unlike the expected output.
– michael.hor257k
Nov 23 '18 at 12:37
add a comment |
Here's one way:
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FileHashRule">
<FileHashRule Id="{@Id}">
<xsl:apply-templates mode="one"/>
</FileHashRule>
<FileHashRule Id="{@Id + 1}">
<xsl:apply-templates mode="two"/>
</FileHashRule>
</xsl:template>
<xsl:template match="FileHash[position() > last() div 2]" mode="one"/>
<xsl:template match="FileHash[position() <= last() div 2]" mode="two"/>
The first rule says: by default, copy nodes unchanged.
The second rule says: For a FileHashRule, create two copies, incrementing the @Id attribute in the second.
The third rule says: during the first phase, skip any FileHash element in the second half of the list.
The fourth rule says: during the second phase, skip any FileHash element in the first half of the list.
add a comment |
Here's one way:
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FileHashRule">
<FileHashRule Id="{@Id}">
<xsl:apply-templates mode="one"/>
</FileHashRule>
<FileHashRule Id="{@Id + 1}">
<xsl:apply-templates mode="two"/>
</FileHashRule>
</xsl:template>
<xsl:template match="FileHash[position() > last() div 2]" mode="one"/>
<xsl:template match="FileHash[position() <= last() div 2]" mode="two"/>
The first rule says: by default, copy nodes unchanged.
The second rule says: For a FileHashRule, create two copies, incrementing the @Id attribute in the second.
The third rule says: during the first phase, skip any FileHash element in the second half of the list.
The fourth rule says: during the second phase, skip any FileHash element in the first half of the list.
add a comment |
Here's one way:
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FileHashRule">
<FileHashRule Id="{@Id}">
<xsl:apply-templates mode="one"/>
</FileHashRule>
<FileHashRule Id="{@Id + 1}">
<xsl:apply-templates mode="two"/>
</FileHashRule>
</xsl:template>
<xsl:template match="FileHash[position() > last() div 2]" mode="one"/>
<xsl:template match="FileHash[position() <= last() div 2]" mode="two"/>
The first rule says: by default, copy nodes unchanged.
The second rule says: For a FileHashRule, create two copies, incrementing the @Id attribute in the second.
The third rule says: during the first phase, skip any FileHash element in the second half of the list.
The fourth rule says: during the second phase, skip any FileHash element in the first half of the list.
Here's one way:
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FileHashRule">
<FileHashRule Id="{@Id}">
<xsl:apply-templates mode="one"/>
</FileHashRule>
<FileHashRule Id="{@Id + 1}">
<xsl:apply-templates mode="two"/>
</FileHashRule>
</xsl:template>
<xsl:template match="FileHash[position() > last() div 2]" mode="one"/>
<xsl:template match="FileHash[position() <= last() div 2]" mode="two"/>
The first rule says: by default, copy nodes unchanged.
The second rule says: For a FileHashRule, create two copies, incrementing the @Id attribute in the second.
The third rule says: during the first phase, skip any FileHash element in the second half of the list.
The fourth rule says: during the second phase, skip any FileHash element in the first half of the list.
answered Nov 23 '18 at 12:38
Michael Kay
108k660114
108k660114
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445663%2fsplit-xml-node-by-half-xslt-transformation%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Define "half", esp. in the case of odd number of nodes. -- Note also that the output you show is not well-formed XML (lacks a single root element).
– michael.hor257k
Nov 23 '18 at 12:12
@michael.hor257k, corrected, about half, doesnt matter
– Alexander
Nov 23 '18 at 12:22
When you're learning a new language, you don't need experience and you don't need an example that solves the exact problem you're tackling, you need a good book or tutorial that teaches the concepts, and you should learn by doing simple exercises first before you try and tackle a more difficult problem.
– Michael Kay
Nov 23 '18 at 12:26
You keep changing your input XML format. Now that you have added the
RuleCollection
wrapper, you must change thefileHash
variable definition to:<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />
- see: xsltfiddle.liberty-development.net/jyH9rNq/4– michael.hor257k
Nov 24 '18 at 9:01
@michael.hor257k, Thanks a lot, works great. what I need
– Alexander
Nov 24 '18 at 20:37