Feature request: Validation for linked images in SVG paths

Hey Guys, This is a feature request that's not extremely crucial, but it would be helpful for us. I'm having our authors create SVG overlays and link to the background image (jpeg or png). Sometimes they accidentally link to an image that isn't in our repository path. Within the SVG, I'll end up with something like: <image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" > When it should be: <image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" > Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image. It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image. Example: [cid:image001.png@01CE8C60.F936CBB0] Thanks! Matt AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.

Hello Matt, In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file"> <ns uri="http://expath.org/ns/file" prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]"> <let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema> Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote:
Hey Guys,
This is a feature request that's not extremely crucial, but it would be helpful for us.
I'm having our authors create SVG overlays and link to the background image (jpeg or png).
Sometimes they accidentally link to an image that isn't in our repository path.
Within the SVG, I'll end up with something like:
<image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" >
When it should be:
<image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" >
Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image.
It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image.
Example:
Thanks! Matt
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
_______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com http://www.oxygenxml.com/mailman/listinfo/oxygen-user

Hey Alex, This looks really promising! When I run validate with this schematron I get the following: System ID: C:\svn\scripts\svgCheck.sch Engine name: ISO Schematron (XSLT 2.0) Severity: fatal Type: XML validation Start location: 149:0 (Odd because the schematron is only 14 lines) System ID: C:\dita\pt\products\vitek2systems\pi\Appendix_A.dita (This is the first file with an SVG for the document I checked.) Engine name: ISO Schematron (XSLT 2.0) Severity: error Description: Exception thrown by extension function {public static boolean com.saxonica.functions.extfn.EXPathFile.exists(java.lang.String)}: java.lang.NullPointerException Type: XML validation Even if I delete all SVG references, I receive the above two errors. I then tried it on a map with more SVGs and some that were verified to be broken. It is properly detecting the errors but I see false positives when the SVG contains embedded images instead of linked. I believe it's trying to verify the binary data as the uri. System ID: C:\dita\en\products\simon\service\Attachments.dita Engine name: ISO Schematron (XSLT 2.0) Severity: error Description: A sequence of more than one item is not allowed as the first argument of resolve-uri() ("data:image/jpeg;base64,/9j/4AA...", "data:image/png;base64,iVBORw0K...") Type: XML validation Is there a way for me to adjust the schematron to ignore href values that start with "data"? I had previously attended a webinar Oxygen presented on schematron. I'm finally starting to understand how powerful it can be! Thank you, Matt From: oxygen-user-bounces@oxygenxml.com [mailto:oxygen-user-bounces@oxygenxml.com] On Behalf Of Alex Jitianu Sent: Tuesday, July 30, 2013 2:25 AM To: oxygen-user@oxygenxml.com Subject: Re: [oXygen-user] Feature request: Validation for linked images in SVG paths Hello Matt, In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"<http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file"<http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file"<http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]"<mailto:image[ends-with(@href,'.svg')]>> <let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema> Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote: Hey Guys, This is a feature request that's not extremely crucial, but it would be helpful for us. I'm having our authors create SVG overlays and link to the background image (jpeg or png). Sometimes they accidentally link to an image that isn't in our repository path. Within the SVG, I'll end up with something like: <image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" > When it should be: <image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" > Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image. It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image. Example: [cid:image001.png@01CE8CF5.2C3637F0] Thanks! Matt AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments. _______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com<mailto:oXygen-user@oxygenxml.com> http://www.oxygenxml.com/mailman/listinfo/oxygen-user AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.

Hello Matt, 1. The odd line is related to the fact that when validating with a Schematron file under the hood the Schematron is transformed in XSLT and that XSLT is applied on the document. The reported error line is inside that intermediate XSLT and unfortunately I don't think there is a round trip to get the real location in the Schematron file. 2. I believe the NullPointerException is a side effect of the fact that I didn't consider the fact that the SVG file is also referred relatively in the DITA document. As a result the SVG will not get located and parsed by the document() function and later on exists() function will break. In the example below I've added the resolve-uri() function to compute the SVG document location. 3. In the example below I've changed a bit the assert XPath to ignore the href values that start with 'data'. You should also take into account the fact that the SVG can contain multiple image elements. Perhaps you could assert it more elegantly than this but here a possible solution: <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file"> <ns uri="http://expath.org/ns/file" prefix="exslt"/> <pattern> <rule context="image"> <let name="svgDocument" value="document(resolve-uri(@href, base-uri()))" /> <let name="svgExists" value="exists($svgDocument)"/> <assert test="$svgExists">The SVG file can't be loaded <value-of select="resolve-uri(@href, base-uri())"/></assert> <let name="realImages" value="$svgDocument//*:image/@*:href"/> <!-- If the SVG file can't be loaded or the SVG points to an embeded image SKIP IT. --> <let name="testImages" value="for $realImage in $realImages return if (not($svgExists) or starts-with($realImage, 'data')) then true() else exslt:exists(resolve-uri($realImage, base-uri($svgDocument)))"/> <assert test="empty(index-of($testImages, false()))">The image file must exist</assert> </rule> </pattern> </schema> Best regards, Alex On 30-Jul-13 3:33 PM, KAATMAN Matthew wrote:
Hey Alex,
This looks really promising!
When I run validate with this schematron I get the following:
System ID: C:\svn\scripts\svgCheck.sch
Engine name: ISO Schematron (XSLT 2.0)
Severity: fatal
Type: XML validation
Start location: 149:0 (Odd because the schematron is only 14 lines)
System ID: C:\dita\pt\products\vitek2systems\pi\Appendix_A.dita (This is the first file with an SVG for the document I checked.)
Engine name: ISO Schematron (XSLT 2.0)
Severity: error
Description: Exception thrown by extension function {public static boolean com.saxonica.functions.extfn.EXPathFile.exists(java.lang.String)}: java.lang.NullPointerException
Type: XML validation
Even if I delete all SVG references, I receive the above two errors.
I then tried it on a map with more SVGs and some that were verified to be broken. It is properly detecting the errors but I see false positives when the SVG contains embedded images instead of linked. I believe it's trying to verify the binary data as the uri.
System ID: C:\dita\en\products\simon\service\Attachments.dita
Engine name: ISO Schematron (XSLT 2.0)
Severity: error
Description: A sequence of more than one item is not allowed as the first argument of resolve-uri() ("data:image/jpeg;base64,/9j/4AA...", "data:image/png;base64,iVBORw0K...")
Type: XML validation
Is there a way for me to adjust the schematron to ignore href values that start with "data"?
I had previously attended a webinar Oxygen presented on schematron. I'm finally starting to understand how powerful it can be!
Thank you, Matt
*From:*oxygen-user-bounces@oxygenxml.com [mailto:oxygen-user-bounces@oxygenxml.com] *On Behalf Of *Alex Jitianu *Sent:* Tuesday, July 30, 2013 2:25 AM *To:* oxygen-user@oxygenxml.com *Subject:* Re: [oXygen-user] Feature request: Validation for linked images in SVG paths
Hello Matt,
In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" <http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file" <http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file" <http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]" <mailto:image[ends-with%28@href,%27.svg%27%29]>> <let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema>
Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com
On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote:
Hey Guys,
This is a feature request that's not extremely crucial, but it would be helpful for us.
I'm having our authors create SVG overlays and link to the background image (jpeg or png).
Sometimes they accidentally link to an image that isn't in our repository path.
Within the SVG, I'll end up with something like:
<image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" >
When it should be:
<image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" >
Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image.
It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image.
Example:
Thanks! Matt
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
_______________________________________________
oXygen-user mailing list
oXygen-user@oxygenxml.com <mailto:oXygen-user@oxygenxml.com>
http://www.oxygenxml.com/mailman/listinfo/oxygen-user
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.

It's close Alex. I think it's testing non-SVG images now so it leads to two errors for each image in the document. I think maybe I need to go back to the previous rule context. <rule context="image[ends-with(@href, '.svg')]"<mailto:image[ends-with(@href,'.svg')]>> or maybe multiple rule contexts. System ID: C:\dita\en\products\simon\images\Shock_Tilt_Watch_Indicators.JPG Engine name: ISO Schematron (XSLT 2.0) Severity: fatal Description: Invalid byte 1 of 1-byte UTF-8 sequence. Type: XML validation Start location: 1:1 System ID: C:\dita\en\products\simon\service\VerifyContents.dita Engine name: ISO Schematron (XSLT 2.0) Severity: error Description: The SVG file can't be loaded file:/C:/dita/en/products/simon/images/Shock_Tilt_Watch_Indicators.JPG ($svgExists) [assert] Type: XML validation Start location: 24:56 This is a great working example for me to play with. I'll report back if I can get it straightened out. Thanks! Matt From: Alex Jitianu [mailto:alex_jitianu@sync.ro] Sent: Tuesday, July 30, 2013 9:35 AM To: KAATMAN Matthew Cc: oxygen-user@oxygenxml.com Subject: Re: [oXygen-user] Feature request: Validation for linked images in SVG paths Hello Matt, 1. The odd line is related to the fact that when validating with a Schematron file under the hood the Schematron is transformed in XSLT and that XSLT is applied on the document. The reported error line is inside that intermediate XSLT and unfortunately I don't think there is a round trip to get the real location in the Schematron file. 2. I believe the NullPointerException is a side effect of the fact that I didn't consider the fact that the SVG file is also referred relatively in the DITA document. As a result the SVG will not get located and parsed by the document() function and later on exists() function will break. In the example below I've added the resolve-uri() function to compute the SVG document location. 3. In the example below I've changed a bit the assert XPath to ignore the href values that start with 'data'. You should also take into account the fact that the SVG can contain multiple image elements. Perhaps you could assert it more elegantly than this but here a possible solution: <schema xmlns="http://purl.oclc.org/dsdl/schematron"<http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file"<http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file"<http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image"> <let name="svgDocument" value="document(resolve-uri(@href, base-uri()))" /> <let name="svgExists" value="exists($svgDocument)"/> <assert test="$svgExists">The SVG file can't be loaded <value-of select="resolve-uri(@href, base-uri())"/></assert> <let name="realImages" value="$svgDocument//*:image/@*:href"/> <!-- If the SVG file can't be loaded or the SVG points to an embeded image SKIP IT. --> <let name="testImages" value="for $realImage in $realImages return if (not($svgExists) or starts-with($realImage, 'data')) then true() else exslt:exists(resolve-uri($realImage, base-uri($svgDocument)))"/> <assert test="empty(index-of($testImages, false()))">The image file must exist</assert> </rule> </pattern> </schema> Best regards, Alex On 30-Jul-13 3:33 PM, KAATMAN Matthew wrote: Hey Alex, This looks really promising! When I run validate with this schematron I get the following: System ID: C:\svn\scripts\svgCheck.sch Engine name: ISO Schematron (XSLT 2.0) Severity: fatal Type: XML validation Start location: 149:0 (Odd because the schematron is only 14 lines) System ID: C:\dita\pt\products\vitek2systems\pi\Appendix_A.dita (This is the first file with an SVG for the document I checked.) Engine name: ISO Schematron (XSLT 2.0) Severity: error Description: Exception thrown by extension function {public static boolean com.saxonica.functions.extfn.EXPathFile.exists(java.lang.String)}: java.lang.NullPointerException Type: XML validation Even if I delete all SVG references, I receive the above two errors. I then tried it on a map with more SVGs and some that were verified to be broken. It is properly detecting the errors but I see false positives when the SVG contains embedded images instead of linked. I believe it's trying to verify the binary data as the uri. System ID: C:\dita\en\products\simon\service\Attachments.dita Engine name: ISO Schematron (XSLT 2.0) Severity: error Description: A sequence of more than one item is not allowed as the first argument of resolve-uri() ("data:image/jpeg;base64,/9j/4AA..."<data:image/jpeg;base64,/9j/4AA...>, "data:image/png;base64,iVBORw0K..."<data:image/png;base64,iVBORw0K...>) Type: XML validation Is there a way for me to adjust the schematron to ignore href values that start with "data"? I had previously attended a webinar Oxygen presented on schematron. I'm finally starting to understand how powerful it can be! Thank you, Matt From: oxygen-user-bounces@oxygenxml.com<mailto:oxygen-user-bounces@oxygenxml.com> [mailto:oxygen-user-bounces@oxygenxml.com] On Behalf Of Alex Jitianu Sent: Tuesday, July 30, 2013 2:25 AM To: oxygen-user@oxygenxml.com<mailto:oxygen-user@oxygenxml.com> Subject: Re: [oXygen-user] Feature request: Validation for linked images in SVG paths Hello Matt, In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"<http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file"<http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file"<http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]"<mailto:image[ends-with%28@href,%27.svg%27%29]>> <let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema> Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote: Hey Guys, This is a feature request that's not extremely crucial, but it would be helpful for us. I'm having our authors create SVG overlays and link to the background image (jpeg or png). Sometimes they accidentally link to an image that isn't in our repository path. Within the SVG, I'll end up with something like: <image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" > When it should be: <image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" > Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image. It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image. Example: [cid:image001.png@01CE8D0D.3FEA8B30] Thanks! Matt AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments. _______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com<mailto:oXygen-user@oxygenxml.com> http://www.oxygenxml.com/mailman/listinfo/oxygen-user AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments. AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.

Hi Matt, You're right about the context. I've probably accidentally removed the ends-with(@href, '.svg') part. You should also integrate Wendell suggestions (thank you Wendell) as they are better and much cleaner than what I came up with. Best regards, Alex On 30-Jul-13 6:13 PM, KAATMAN Matthew wrote:
It's close Alex.
I think it's testing non-SVG images now so it leads to two errors for each image in the document. I think maybe I need to go back to the previous rule context.
<rule context="image[ends-with(@href, '.svg')]" <mailto:image[ends-with%28@href,%27.svg%27%29]>> or maybe multiple rule contexts.
System ID: C:\dita\en\products\simon\images\Shock_Tilt_Watch_Indicators.JPG
Engine name: ISO Schematron (XSLT 2.0)
Severity: fatal
Description: Invalid byte 1 of 1-byte UTF-8 sequence.
Type: XML validation
Start location: 1:1
System ID: C:\dita\en\products\simon\service\VerifyContents.dita
Engine name: ISO Schematron (XSLT 2.0)
Severity: error
Description: The SVG file can't be loaded file:/C:/dita/en/products/simon/images/Shock_Tilt_Watch_Indicators.JPG ($svgExists) [assert]
Type: XML validation
Start location: 24:56
This is a great working example for me to play with. I'll report back if I can get it straightened out.
Thanks! Matt
*From:*Alex Jitianu [mailto:alex_jitianu@sync.ro] *Sent:* Tuesday, July 30, 2013 9:35 AM *To:* KAATMAN Matthew *Cc:* oxygen-user@oxygenxml.com *Subject:* Re: [oXygen-user] Feature request: Validation for linked images in SVG paths
Hello Matt,
1. The odd line is related to the fact that when validating with a Schematron file under the hood the Schematron is transformed in XSLT and that XSLT is applied on the document. The reported error line is inside that intermediate XSLT and unfortunately I don't think there is a round trip to get the real location in the Schematron file.
2. I believe the NullPointerException is a side effect of the fact that I didn't consider the fact that the SVG file is also referred relatively in the DITA document. As a result the SVG will not get located and parsed by the document() function and later on exists() function will break. In the example below I've added the resolve-uri() function to compute the SVG document location.
3. In the example below I've changed a bit the assert XPath to ignore the href values that start with 'data'. You should also take into account the fact that the SVG can contain multiple image elements. Perhaps you could assert it more elegantly than this but here a possible solution:
<schema xmlns="http://purl.oclc.org/dsdl/schematron" <http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file" <http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file" <http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image"> <let name="svgDocument" value="document(resolve-uri(@href, base-uri()))" /> <let name="svgExists" value="exists($svgDocument)"/> <assert test="$svgExists">The SVG file can't be loaded <value-of select="resolve-uri(@href, base-uri())"/></assert>
<let name="realImages" value="$svgDocument//*:image/@*:href"/> <!-- If the SVG file can't be loaded or the SVG points to an embeded image SKIP IT. --> <let name="testImages" value="for $realImage in $realImages return if (not($svgExists) or starts-with($realImage, 'data')) then true() else exslt:exists(resolve-uri($realImage, base-uri($svgDocument)))"/> <assert test="empty(index-of($testImages, false()))">The image file must exist</assert>
</rule> </pattern> </schema>
Best regards, Alex
On 30-Jul-13 3:33 PM, KAATMAN Matthew wrote:
Hey Alex,
This looks really promising!
When I run validate with this schematron I get the following:
System ID: C:\svn\scripts\svgCheck.sch
Engine name: ISO Schematron (XSLT 2.0)
Severity: fatal
Type: XML validation
Start location: 149:0 (Odd because the schematron is only 14 lines)
System ID: C:\dita\pt\products\vitek2systems\pi\Appendix_A.dita (This is the first file with an SVG for the document I checked.)
Engine name: ISO Schematron (XSLT 2.0)
Severity: error
Description: Exception thrown by extension function {public static boolean com.saxonica.functions.extfn.EXPathFile.exists(java.lang.String)}: java.lang.NullPointerException
Type: XML validation
Even if I delete all SVG references, I receive the above two errors.
I then tried it on a map with more SVGs and some that were verified to be broken. It is properly detecting the errors but I see false positives when the SVG contains embedded images instead of linked. I believe it's trying to verify the binary data as the uri.
System ID: C:\dita\en\products\simon\service\Attachments.dita
Engine name: ISO Schematron (XSLT 2.0)
Severity: error
Description: A sequence of more than one item is not allowed as the first argument of resolve-uri() ("data:image/jpeg;base64,/9j/4AA..." <data:image/jpeg;base64,/9j/4AA...>, "data:image/png;base64,iVBORw0K..." <data:image/png;base64,iVBORw0K...>)
Type: XML validation
Is there a way for me to adjust the schematron to ignore href values that start with "data"?
I had previously attended a webinar Oxygen presented on schematron. I'm finally starting to understand how powerful it can be!
Thank you, Matt
*From:*oxygen-user-bounces@oxygenxml.com <mailto:oxygen-user-bounces@oxygenxml.com> [mailto:oxygen-user-bounces@oxygenxml.com] *On Behalf Of *Alex Jitianu *Sent:* Tuesday, July 30, 2013 2:25 AM *To:* oxygen-user@oxygenxml.com <mailto:oxygen-user@oxygenxml.com> *Subject:* Re: [oXygen-user] Feature request: Validation for linked images in SVG paths
Hello Matt,
In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" <http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file" <http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file" <http://expath.org/ns/file> prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]" <mailto:image[ends-with%28@href,%27.svg%27%29]>> <let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema>
Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com
On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote:
Hey Guys,
This is a feature request that's not extremely crucial, but it would be helpful for us.
I'm having our authors create SVG overlays and link to the background image (jpeg or png).
Sometimes they accidentally link to an image that isn't in our repository path.
Within the SVG, I'll end up with something like:
<image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" >
When it should be:
<image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" >
Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I'd be missing that image.
It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image.
Example:
Thanks! Matt
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
_______________________________________________
oXygen-user mailing list
oXygen-user@oxygenxml.com <mailto:oXygen-user@oxygenxml.com>
http://www.oxygenxml.com/mailman/listinfo/oxygen-user
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.

Hi, Schematron is not only useful; it's fun. (I admit I am hard-core.) Refactoring a little (but untested): <let name="referencedImages" value="$svgDocument//*:image/@*:href[not( starts-with(.,'data'))]"/> <let name="missingImages" value="$referencedImages[not(exslt:exists( resolve-uri($t, base-uri($svgDocument))))]"/> <assert test="empty($missingImages)">An image file referenced in SVG image <value-of select="@href"/> is missing: check for <value-of select="string-join($missingImages,', ')"/></assert> Thanks to Alex for doing the real work. Cheers, Wendell Wendell Piez | http://www.wendellpiez.com XML | XSLT | electronic publishing Eat Your Vegetables _____oo_________o_o___ooooo____ooooooo_^ On Tue, Jul 30, 2013 at 10:35 AM, Alex Jitianu <alex_jitianu@sync.ro> wrote:
Hello Matt,
1. The odd line is related to the fact that when validating with a Schematron file under the hood the Schematron is transformed in XSLT and that XSLT is applied on the document. The reported error line is inside that intermediate XSLT and unfortunately I don't think there is a round trip to get the real location in the Schematron file.
2. I believe the NullPointerException is a side effect of the fact that I didn't consider the fact that the SVG file is also referred relatively in the DITA document. As a result the SVG will not get located and parsed by the document() function and later on exists() function will break. In the example below I've added the resolve-uri() function to compute the SVG document location.
3. In the example below I've changed a bit the assert XPath to ignore the href values that start with 'data'. You should also take into account the fact that the SVG can contain multiple image elements. Perhaps you could assert it more elegantly than this but here a possible solution:
<schema xmlns="http://purl.oclc.org/dsdl/schematron"<http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file" <http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file" <http://expath.org/ns/file>prefix="exslt"/> <pattern> <rule context="image"> <let name="svgDocument" value="document(resolve-uri(@href, base-uri()))" /> <let name="svgExists" value="exists($svgDocument)"/> <assert test="$svgExists">The SVG file can't be loaded <value-of select="resolve-uri(@href, base-uri())"/></assert>
<let name="realImages" value="$svgDocument//*:image/@*:href"/> <!-- If the SVG file can't be loaded or the SVG points to an embeded image SKIP IT. --> <let name="testImages" value="for $realImage in $realImages return if (not($svgExists) or starts-with($realImage, 'data')) then true() else exslt:exists(resolve-uri($realImage, base-uri($svgDocument)))"/> <assert test="empty(index-of($testImages, false()))">The image file must exist</assert>
</rule> </pattern> </schema>
Best regards, Alex
On 30-Jul-13 3:33 PM, KAATMAN Matthew wrote:
Hey Alex,****
** **
This looks really promising!****
** **
When I run validate with this schematron I get the following:****
** **
System ID: C:\svn\scripts\svgCheck.sch****
Engine name: ISO Schematron (XSLT 2.0)****
Severity: fatal****
Type: XML validation****
Start location: 149:0 (Odd because the schematron is only 14 lines)****
** **
System ID: C:\dita\pt\products\vitek2systems\pi\Appendix_A.dita (This is the first file with an SVG for the document I checked.)****
Engine name: ISO Schematron (XSLT 2.0)****
Severity: error****
Description: Exception thrown by extension function {public static boolean com.saxonica.functions.extfn.EXPathFile.exists(java.lang.String)}: java.lang.NullPointerException****
Type: XML validation****
** **
Even if I delete all SVG references, I receive the above two errors.****
** **
I then tried it on a map with more SVGs and some that were verified to be broken. It is properly detecting the errors but I see false positives when the SVG contains embedded images instead of linked. I believe it’s trying to verify the binary data as the uri.****
** **
System ID: C:\dita\en\products\simon\service\Attachments.dita****
Engine name: ISO Schematron (XSLT 2.0)****
Severity: error****
Description: A sequence of more than one item is not allowed as the first argument of resolve-uri() ("data:image/jpeg;base64,/9j/4AA...", "data:image/png;base64,iVBORw0K...") ****
Type: XML validation****
** **
Is there a way for me to adjust the schematron to ignore href values that start with “data”?****
** **
I had previously attended a webinar Oxygen presented on schematron. I’m finally starting to understand how powerful it can be!****
** **
Thank you, Matt****
** **
** **
*From:* oxygen-user-bounces@oxygenxml.com [ mailto:oxygen-user-bounces@oxygenxml.com<oxygen-user-bounces@oxygenxml.com>] *On Behalf Of *Alex Jitianu *Sent:* Tuesday, July 30, 2013 2:25 AM *To:* oxygen-user@oxygenxml.com *Subject:* Re: [oXygen-user] Feature request: Validation for linked images in SVG paths****
** **
Hello Matt,
In Oxygen v15.0 we've added in the "Validate and check for Completeness" dialog a new entry called "Additional schematron checks" in which you can specify additional Schematron checks that should be be executed on the topics. You can perform the check you've described using a Schematron file with the following content:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"<http://purl.oclc.org/dsdl/schematron> queryBinding="xslt2" xmlns:exslt="http://expath.org/ns/file" <http://expath.org/ns/file>> <ns uri="http://expath.org/ns/file" <http://expath.org/ns/file>prefix="exslt"/> <pattern> <rule context="image[ends-with(@href, '.svg')]"<image[ends-with%28@href,%27.svg%27%29]>
<let name="svgDocument" value="document(@href)" /> <assert test="exslt:exists(resolve-uri($svgDocument//*:image/@*:href, base-uri($svgDocument)))"> The image file from the following SVG doesn't exist: <value-of select="base-uri($svgDocument)"/></assert> </rule> </pattern> </schema>
Best regards, Alex -- Alex Jitianu <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com
On 29-Jul-13 9:38 PM, KAATMAN Matthew wrote:****
Hey Guys,****
****
This is a feature request that's not extremely crucial, but it would be helpful for us.****
****
I'm having our authors create SVG overlays and link to the background image (jpeg or png).****
****
Sometimes they accidentally link to an image that isn't in our repository path.****
****
Within the SVG, I'll end up with something like:****
<image width="1200" height="1807" xlink:href="../../../../../../../Users/Username/Pictures/PREVI PAV/PAV_printer_cover_open.jpg" >****
****
When it should be:****
<image width="1200" height="1807" xlink:href="images/PAV_printer_cover_open.jpg" >****
****
Although, the validate/check for completeness wouldn't catch this on their workstation as the image exists and is valid, it would find it quickly on mine since it's outside the path that gets checked in and I’d be missing that image.****
****
It doesn't seem like the OT throws any errors either. The only way I find out is when I'm viewing the PDF and notice that antenna house has substituted a broken image.****
****
Example:****
****
****
Thanks! Matt****
AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
****
_______________________________________________****
oXygen-user mailing list****
oXygen-user@oxygenxml.com****
http://www.oxygenxml.com/mailman/listinfo/oxygen-user****
** ** AVIS : Ce courrier et ses pieces jointes sont destines a leur seul destinataire et peuvent contenir des informations confidentielles appartenant a bioMerieux. Si vous n'etes pas destinataire, vous etes informe que toute lecture, divulgation, ou reproduction de ce message et des pieces jointes est strictement interdite. Si vous avez recu ce message par erreur merci d'en prevenir l'expediteur et de le detruire, ainsi que ses pieces jointes. NOTICE: This message and attachments are intended only for the use of their addressee and may contain confidential information belonging to bioMerieux. If you are not the intended recipient, you are hereby notified that any reading, dissemination, distribution, or copying of this message, or any attachment, is strictly prohibited. If you have received this message in error, please notify the original sender immediately and delete this message, along with any attachments.
_______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com http://www.oxygenxml.com/mailman/listinfo/oxygen-user
participants (3)
-
Alex Jitianu
-
KAATMAN Matthew
-
Wendell Piez