I have a large XML file stored in BaseX that I need to split up into smaller, modular documents. I have created an XSL file to do so: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output indent="yes" encoding="UTF-8"/> <xsl:param name="schema"/> <xsl:param name="model"/> <xsl:param name="sysDiff"/> <xsl:param name="sys"/> <xsl:param name="subsys"/> <xsl:param name="subsubsys"/> <xsl:param name="assy"/> <xsl:param name="disassy"/> <xsl:param name="disassyv"/> <xsl:param name="info"/> <xsl:param name="infov"/> <xsl:param name="itemloc"/> <xsl:param name="tname"/> <xsl:param name="iname"/> <xsl:param name="outputDir"/>
<xsl:template match="/"> <xsl:result-document href="{concat($outputDir, '/DMC-',$model,'-',$sysDiff,'-',$sys,'-',$subsys,$subsubsys,'-',$assy,'-',$disassy,$disassyv,'-',$info,$infov,'-',$itemloc,'.xml')}" method="xml"> <dmodule> <identAndStatusSection> <dmAddress> <dmIdent> <dmCode modelIdentCode="{$model}" systemDiffCode="{$sysDiff}"> <xsl:attribute name="systemCode" select="$sys"/> <xsl:attribute name="subSystemCode" select="$subsys"/> <xsl:attribute name="subSubSystemCode" select="$subsubsys"/> <xsl:attribute name="assyCode" select="$assy"/> <xsl:attribute name="disassyCode" select="$disassy"/> <xsl:attribute name="disassyCodeVariant" select="$disassyv"/> <xsl:attribute name="infoCode" select="$info"/> <xsl:attribute name="infoCodeVariant" select="$infov"/> <xsl:attribute name="itemLocationCode" select="$itemloc"/> </dmCode> <language languageIsoCode="en" countryIsoCode="US"/> <issueInfo issueNumber="000" inWork="01"/> </dmIdent> </dmAddress> </identAndStatusSection> </dmodule> </xsl:result-document> </xsl:template> </xsl:stylesheet>
My issue is that when using the xslt:transform() function in BaseX it only returns (creates) the first document. This is the XQuery I have for this: let $style := doc('file:///C:/base.xsl')
for $d in doc('file:///C:/Users/tfurst/Documents/Book1-test.xml')//title for $newD in //*[title] where $newD/title/@id eq $d/@id let $schema := $d/schemaName let $model := $d/modelic let $sdc := $d/sdc let $sys := $d/systemCode let $subsys := $d/subsys let $subsubsys := $d/subsubsys let $assy := $d/assy let $disassy := $d/disassy let $disassyv := $d/disassyv let $info := $d/infoCode let $infov := $d/infov let $itemloc := $d/itemloc let $tname := $d/tname let $iname := $d/iname return xslt:transform($newD,$style, map {"outputDir":"file:///G:/LMA-Conv/Flight/test-conv-out", "model":$model, "sysDiff":$sdc, "sys":$sys, "subsys":$subsys, "subsubsys":$subsubsys, "assy":$assy, "disassy":$disassy, "disassyv":$disassyv, "info":$info, "infov":$infov, "itemloc":$itemloc, "tname":$tname, "iname":$iname})
The document named Book1-test.xml is essentially a map of existing IDs of elements to new output file names. After it creates the first XML output file BaseX returns ERROR [FODC0002] "" (Line 1): Premature end of file. When I looked up the error code in the BaseX documentation this error is defined as "The specified document resource cannot be retrieved. ". Is there some limitation to the use of the xslt:transform function in a loop? I am not understanding why it was able to retrieved the first time, but not after that. I have tried to move the XSL to different file locations, no luck. Am I missing something ridiculously obvious here? This XSL stylesheet is a very simplified version of what it will ultimately become, I wanted to get the process down before fully developing the XSL.
Thank you,
Tom Furst NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies.https://www.rcmt.com
NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies.https://www.rcmt.com
Hi Tom,
The problem is most probably that your XSLT doesn’t create a *primary* output. It just writes something to another result-document. However, the interface for invoking an XSLT expects some result document. So if you just create a <bogus/> element next to xsl:result-document and then discard it, it should just work.
Gerrit
On 21.05.2020 17:22, Furst, Thomas wrote:
I have a large XML file stored in BaseX that I need to split up into smaller, modular documents. I have created an XSL file to do so:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes" encoding="UTF-8"/>
<xsl:param name="schema"/>
<xsl:param name="model"/>
<xsl:param name="sysDiff"/>
<xsl:param name="sys"/>
<xsl:param name="subsys"/>
<xsl:param name="subsubsys"/>
<xsl:param name="assy"/>
<xsl:param name="disassy"/>
<xsl:param name="disassyv"/>
<xsl:param name="info"/>
<xsl:param name="infov"/>
<xsl:param name="itemloc"/>
<xsl:param name="tname"/>
<xsl:param name="iname"/>
<xsl:param name="outputDir"/>
<xsl:template match="/">
<xsl:result-document href="{concat($outputDir, '/DMC-',$model,'-',$sysDiff,'-',$sys,'-',$subsys,$subsubsys,'-',$assy,'-',$disassy,$disassyv,'-',$info,$infov,'-',$itemloc,'.xml')}" method="xml">
<dmodule>
<identAndStatusSection>
<dmAddress>
<dmIdent>
<dmCode modelIdentCode="{$model}" systemDiffCode="{$sysDiff}">
<xsl:attribute name="systemCode" select="$sys"/>
<xsl:attribute name="subSystemCode" select="$subsys"/>
<xsl:attribute name="subSubSystemCode" select="$subsubsys"/>
<xsl:attribute name="assyCode" select="$assy"/>
<xsl:attribute name="disassyCode" select="$disassy"/>
<xsl:attribute name="disassyCodeVariant" select="$disassyv"/>
<xsl:attribute name="infoCode" select="$info"/>
<xsl:attribute name="infoCodeVariant" select="$infov"/>
<xsl:attribute name="itemLocationCode" select="$itemloc"/>
</dmCode>
<language languageIsoCode="en" countryIsoCode="US"/>
<issueInfo issueNumber="000" inWork="01"/>
</dmIdent>
</dmAddress>
</identAndStatusSection>
</dmodule>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
My issue is that when using the xslt:transform() function in BaseX it only returns (creates) the first document. This is the XQuery I have for this:
let $style := doc('file:///C:/base.xsl')
for $d in doc('file:///C:/Users/tfurst/Documents/Book1-test.xml')//title
for $newD in //*[title]
where $newD/title/@id eq $d/@id
let $schema := $d/schemaName
let $model := $d/modelic
let $sdc := $d/sdc
let $sys := $d/systemCode
let $subsys := $d/subsys
let $subsubsys := $d/subsubsys
let $assy := $d/assy
let $disassy := $d/disassy
let $disassyv := $d/disassyv
let $info := $d/infoCode
let $infov := $d/infov
let $itemloc := $d/itemloc
let $tname := $d/tname
let $iname := $d/iname
return xslt:transform($newD,$style, map {"outputDir":"file:///G:/LMA-Conv/Flight/test-conv-out", "model":$model, "sysDiff":$sdc, "sys":$sys, "subsys":$subsys, "subsubsys":$subsubsys, "assy":$assy, "disassy":$disassy, "disassyv":$disassyv, "info":$info, "infov":$infov, "itemloc":$itemloc, "tname":$tname, "iname":$iname})
The document named Book1-test.xml is essentially a map of existing IDs of elements to new output file names. After it creates the first XML output file BaseX returns ERROR [FODC0002] "" (Line 1): Premature end of file. When I looked up the error code in the BaseX documentation this error is defined as *"The specified document resource cannot be retrieved. "*. Is there some limitation to the use of the xslt:transform function in a loop? I am not understanding why it was able to retrieved the first time, but not after that. I have tried to move the XSL to different file locations, no luck. Am I missing something ridiculously obvious here? This XSL stylesheet is a very simplified version of what it will ultimately become, I wanted to get the process down before fully developing the XSL.
Thank you,
Tom Furst
Alternatively, apply your stylesheet using xslt:transform-text() instead of xslt:transform().
On 21.05.2020 18:33, Imsieke, Gerrit, le-tex wrote:
Hi Tom,
The problem is most probably that your XSLT doesn’t create a *primary* output. It just writes something to another result-document. However, the interface for invoking an XSLT expects some result document. So if you just create a <bogus/> element next to xsl:result-document and then discard it, it should just work.
Gerrit
Your query might be much slicker and more efficient if you wrote it completely in XQuery. Did you think about that?
Furst, Thomas Thomas.Furst@rcmt.com schrieb am Do., 21. Mai 2020, 17:22:
I have a large XML file stored in BaseX that I need to split up into smaller, modular documents. I have created an XSL file to do so:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output indent="yes" encoding="UTF-8"/> <xsl:param name="schema"/> <xsl:param name="model"/> <xsl:param name="sysDiff"/> <xsl:param name="sys"/> <xsl:param name="subsys"/> <xsl:param name="subsubsys"/> <xsl:param name="assy"/> <xsl:param name="disassy"/> <xsl:param name="disassyv"/> <xsl:param name="info"/> <xsl:param name="infov"/> <xsl:param name="itemloc"/> <xsl:param name="tname"/> <xsl:param name="iname"/> <xsl:param name="outputDir"/> <xsl:template match="/"> <xsl:result-document href="{concat($outputDir,
'/DMC-',$model,'-',$sysDiff,'-',$sys,'-',$subsys,$subsubsys,'-',$assy,'-',$disassy,$disassyv,'-',$info,$infov,'-',$itemloc,'.xml')}" method="xml">
<dmodule> <identAndStatusSection> <dmAddress> <dmIdent> <dmCode modelIdentCode="{$model}"
systemDiffCode="{$sysDiff}">
<xsl:attribute name="systemCode"
select="$sys"/>
<xsl:attribute name="subSystemCode"
select="$subsys"/>
<xsl:attribute name="subSubSystemCode"
select="$subsubsys"/>
<xsl:attribute name="assyCode"
select="$assy"/>
<xsl:attribute name="disassyCode"
select="$disassy"/>
<xsl:attribute name="disassyCodeVariant"
select="$disassyv"/>
<xsl:attribute name="infoCode"
select="$info"/>
<xsl:attribute name="infoCodeVariant"
select="$infov"/>
<xsl:attribute name="itemLocationCode"
select="$itemloc"/>
</dmCode> <language languageIsoCode="en"
countryIsoCode="US"/>
<issueInfo issueNumber="000" inWork="01"/> </dmIdent> </dmAddress> </identAndStatusSection> </dmodule> </xsl:result-document> </xsl:template>
</xsl:stylesheet>
My issue is that when using the xslt:transform() function in BaseX it only returns (creates) the first document. This is the XQuery I have for this:
let $style := doc('file:///C:/base.xsl')
for $d in doc('file:///C:/Users/tfurst/Documents/Book1-test.xml')//title
for $newD in //*[title] where $newD/title/@id eq $d/@id let $schema := $d/schemaName let $model := $d/modelic let $sdc := $d/sdc let $sys := $d/systemCode let $subsys := $d/subsys let $subsubsys := $d/subsubsys let $assy := $d/assy let $disassy := $d/disassy let $disassyv := $d/disassyv let $info := $d/infoCode let $infov := $d/infov let $itemloc := $d/itemloc let $tname := $d/tname let $iname := $d/iname return xslt:transform($newD,$style, map {"outputDir":"
file:///G:/LMA-Conv/Flight/test-conv-out", "model":$model, "sysDiff":$sdc, "sys":$sys, "subsys":$subsys, "subsubsys":$subsubsys, "assy":$assy, "disassy":$disassy, "disassyv":$disassyv, "info":$info, "infov":$infov, "itemloc":$itemloc, "tname":$tname, "iname":$iname})
The document named Book1-test.xml is essentially a map of existing IDs of elements to new output file names. After it creates the first XML output file BaseX returns ERROR [FODC0002] "" (Line 1): Premature end of file. When I looked up the error code in the BaseX documentation this error is defined as *"The specified document resource cannot be retrieved. "*. Is there some limitation to the use of the xslt:transform function in a loop? I am not understanding why it was able to retrieved the first time, but not after that. I have tried to move the XSL to different file locations, no luck. Am I missing something ridiculously obvious here? This XSL stylesheet is a very simplified version of what it will ultimately become, I wanted to get the process down before fully developing the XSL.
Thank you,
Tom Furst
NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies. https://www.rcmt.com
NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies. https://www.rcmt.com
Yes and no. It was mentioned to me earlier today when posting on SO. I know some XQuery, but not so much as I do XSLT. This current output is not the final transformation, there is quite a bit more to go, this was just early test and ran into this issue. I am open to ideas on how to do this best. I am going to explore the pure XQuery rout this afternoon.
From: Christian Grün christian.gruen@gmail.com Sent: Thursday, May 21, 2020 12:47 PM To: Furst, Thomas Thomas.Furst@rcmt.com Cc: BaseX basex-talk@mailman.uni-konstanz.de Subject: Re: [basex-talk] BaseX XSLT fails after returning first result
Your query might be much slicker and more efficient if you wrote it completely in XQuery. Did you think about that?
Furst, Thomas <Thomas.Furst@rcmt.commailto:Thomas.Furst@rcmt.com> schrieb am Do., 21. Mai 2020, 17:22: I have a large XML file stored in BaseX that I need to split up into smaller, modular documents. I have created an XSL file to do so: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transformhttps://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_1999_XSL_Transform&d=DwMFaQ&c=viCaR4syck-m-tzQNjsSRw&r=8cnUIumRCVK6Z3gJMHR1Kn5-ebe8_mBZSOMSTe0VW6g&m=Ll7Y3KdNGxWUAIcEUMl5-1KY_qGlqo7vNWurWUdXaNg&s=dGWTAzmmlqT9rIopjDqnJYqt5w9iaiHmKv7ZEJKUjKo&e=" xmlns:xs="http://www.w3.org/2001/XMLSchemahttps://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_2001_XMLSchema&d=DwMFaQ&c=viCaR4syck-m-tzQNjsSRw&r=8cnUIumRCVK6Z3gJMHR1Kn5-ebe8_mBZSOMSTe0VW6g&m=Ll7Y3KdNGxWUAIcEUMl5-1KY_qGlqo7vNWurWUdXaNg&s=TMtkIh2P0153JDizacD-8WspDgmhLCT4IZuMS87Uymc&e=" exclude-result-prefixes="xs" version="2.0"> <xsl:output indent="yes" encoding="UTF-8"/> <xsl:param name="schema"/> <xsl:param name="model"/> <xsl:param name="sysDiff"/> <xsl:param name="sys"/> <xsl:param name="subsys"/> <xsl:param name="subsubsys"/> <xsl:param name="assy"/> <xsl:param name="disassy"/> <xsl:param name="disassyv"/> <xsl:param name="info"/> <xsl:param name="infov"/> <xsl:param name="itemloc"/> <xsl:param name="tname"/> <xsl:param name="iname"/> <xsl:param name="outputDir"/>
<xsl:template match="/"> <xsl:result-document href="{concat($outputDir, '/DMC-',$model,'-',$sysDiff,'-',$sys,'-',$subsys,$subsubsys,'-',$assy,'-',$disassy,$disassyv,'-',$info,$infov,'-',$itemloc,'.xml')}" method="xml"> <dmodule> <identAndStatusSection> <dmAddress> <dmIdent> <dmCode modelIdentCode="{$model}" systemDiffCode="{$sysDiff}"> <xsl:attribute name="systemCode" select="$sys"/> <xsl:attribute name="subSystemCode" select="$subsys"/> <xsl:attribute name="subSubSystemCode" select="$subsubsys"/> <xsl:attribute name="assyCode" select="$assy"/> <xsl:attribute name="disassyCode" select="$disassy"/> <xsl:attribute name="disassyCodeVariant" select="$disassyv"/> <xsl:attribute name="infoCode" select="$info"/> <xsl:attribute name="infoCodeVariant" select="$infov"/> <xsl:attribute name="itemLocationCode" select="$itemloc"/> </dmCode> <language languageIsoCode="en" countryIsoCode="US"/> <issueInfo issueNumber="000" inWork="01"/> </dmIdent> </dmAddress> </identAndStatusSection> </dmodule> </xsl:result-document> </xsl:template> </xsl:stylesheet>
My issue is that when using the xslt:transform() function in BaseX it only returns (creates) the first document. This is the XQuery I have for this: let $style := doc('file:///C:/base.xsl')
for $d in doc('file:///C:/Users/tfurst/Documents/Book1-test.xml')//title for $newD in //*[title] where $newD/title/@id eq $d/@id let $schema := $d/schemaName let $model := $d/modelic let $sdc := $d/sdc let $sys := $d/systemCode let $subsys := $d/subsys let $subsubsys := $d/subsubsys let $assy := $d/assy let $disassy := $d/disassy let $disassyv := $d/disassyv let $info := $d/infoCode let $infov := $d/infov let $itemloc := $d/itemloc let $tname := $d/tname let $iname := $d/iname return xslt:transform($newD,$style, map {"outputDir":"file:///G:/LMA-Conv/Flight/test-conv-out", "model":$model, "sysDiff":$sdc, "sys":$sys, "subsys":$subsys, "subsubsys":$subsubsys, "assy":$assy, "disassy":$disassy, "disassyv":$disassyv, "info":$info, "infov":$infov, "itemloc":$itemloc, "tname":$tname, "iname":$iname})
The document named Book1-test.xml is essentially a map of existing IDs of elements to new output file names. After it creates the first XML output file BaseX returns ERROR [FODC0002] "" (Line 1): Premature end of file. When I looked up the error code in the BaseX documentation this error is defined as "The specified document resource cannot be retrieved. ". Is there some limitation to the use of the xslt:transform function in a loop? I am not understanding why it was able to retrieved the first time, but not after that. I have tried to move the XSL to different file locations, no luck. Am I missing something ridiculously obvious here? This XSL stylesheet is a very simplified version of what it will ultimately become, I wanted to get the process down before fully developing the XSL.
Thank you,
Tom Furst NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies.https://www.rcmt.com
NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies.https://www.rcmt.com NOTE: This email message and any attachments are for the sole use of the intended recipient(s) and may contain confidential and/or privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by replying to this email, and destroy all copies of the original message. Thank you, RCM Technologies.https://www.rcmt.com
basex-talk@mailman.uni-konstanz.de