xsl-list
[Top] [All Lists]

Re: [xsl] Find invalid IDREFs

2012-05-17 16:10:47
Charles,

With 600 files, you may simply be able to pull them all together into a tree (using collection()) and then perform a key lookup into them. That's the first thing to try.

For example:

<xsl:key name="item-by-idrefs" match="*[@idrefs]"
         use="tokenize(@idrefs,'\s+')"/>

will provide for retrieving elements that have @idrefs attributes based on their whitespace-tokenized values.

Then in your stylesheet:

<xsl:template match="IDREFS">
  <xsl:apply-templates select="key('item-by-idrefs',IDREF)"/>
</xsl:template>

will apply templates to all the nodes whose @idrefs include the values listed as IDREF in your list. (Or you can do them individually if you need to keep track of each value as you go.)

Then the question becomes how you want your output to look. In your shoes I would probably use document-uri(/) to report the name of the file containing the offending node, and an XPath pointing the rest of the way. The XPath, in this case, could be as simple as

//*[tokenize(@idrefs,'\s+')=$IDREF]

where $IDREF is the offending IDREF value in the particular case and '@idrefs' is the name of the attribute on which it sits.

But you can easily optimize this sort of thing to your processes.

Ask again if you need more specifics.

Cheers,
Wendell

On 5/17/2012 4:42 PM, charlieo0(_at_)comcast(_dot_)net wrote:
I am completely stuck figuring this out. I have list of IDREFs captured from an 
error report. I created a well-formed XML instance from the list of values. 
This is list of IDREFs that have no corresponding ID. I need to find these 
IDREF atrributes in a very large collection of files and generate a report that 
tells writers what files the errors are located.

The validation report was generated from a concatenated, very large complete 
manual. I can locate the errors in that file, but that's not how the manual is 
worked. I need to locate each error in the sub-files.

How do I walk through the list of IDREF elements, locate them in a collection 
of approx. 600 files and generate a report? Any help is appreciated.

XSLT 2.0

My list of IDREFs looks like this (abbreviated):


<?xml version="1.0" encoding="UTF-8"?>
<IDREFS>
<IDREF>NSN-</IDREF>
<IDREF>NSN-</IDREF>
<IDREF>m2025792355320</IDREF>
<IDREF>m22040592355332</IDREF>
<IDREF>m22040592355332</IDREF>
<IDREF>m22040592355332</IDREF>
<IDREF>m2034792355320</IDREF>
<IDREF>m2050492355320</IDREF>
</IDREFS>

My XSLT, which renders no results:


<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 method="text"  omit-xml-declaration="yes" indent="no" />
    <xsl:param name="collection" 
select="collection('file:/M:/?select=M2*.xml')"/>
    <xsl:variable name="IDREFS" select="document('file:/C:/IDREFS.xml')"/>
     <xsl:key name="VALUE" match="IDREFS" use="child::IDREF"/>

     <xsl:template match="/">
         <xsl:result-document method="text" href="file:/C:/bae/test.txt">
         <xsl:for-each select="$collection//@wpid | //@itemid">
             <xsl:variable name="ATTR" select="."/>
             <xsl:for-each select="$IDREFS">
                 <xsl:value-of select="base-uri(.)"/><xsl:value-of 
select="key('VALUE',$ATTR)"/>
             </xsl:for-each>
             <xsl:text>&#x0A;</xsl:text>
         </xsl:for-each>
     </xsl:result-document>
     </xsl:template>

</xsl:stylesheet>


--
======================================================================
Wendell Piez                            
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>