XSLT重命名result-document()中的链接目标

时间:2014-03-08 21:13:58

标签: xslt

使用result-document()将深层嵌套的XML文档拆分为多个输出文件时,是否有一种方法可以重写@href值以指向新文档中的ID?例如,将书籍分成多个文档,每个文档都成为一个新文件,以book-part / @ id命名。在第1章的输出文件中,第2章的输出文件中可能存在指向目标的链接,该链接值在单个文件中是相对的。现在,指向不同文件的此链接应该具有第2章的文件名,后跟#和原始目标值。有正确的链接元素(相关对象)也有变化,但它是我试图专门生成的目标值。 即链接目标模式:[outputfilename.xml]#[original-filetarget-id]

似乎我需要在原始文件中收集每个@rid的值,并在插入文件名之前检查,如果目标将在不同的文件中,并根据文件中的文件写入输出@ document-id它会输出。但是我无法理解如何知道输出文件名以及XSLT中重写目标的位置。

source xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//NLM//DTD Book DTD v2.1 20050630//EN" "book.dtd">
<book dtd-version="3.0">
    <book-meta>
        <book-id>123.4567890</book-id>
    </book-meta>
    <body>
        <book-part book-part-type="chapter" id="book.123.4567890.ch01">
            <book-part-meta>
                <title-group>
                    <title>Chapter 1</title>
                </title-group>
            </book-part-meta>
            <body>
                <p> some text with a <xref rid="a">link to chapter 1</xref></p>
                <p> some text with a <xref rid="b">link to chapter 2</xref></p>
                <p id="a">a target id in chapter 1</p>
            </body>
        </book-part>
        <book-part book-part-type="chapter" id="book.123.4567890.ch02">
            <book-part-meta>
                <title-group>
                    <title>Chapter 2</title>
                </title-group>
            </book-part-meta>
            <body>
                <p> some text with a <xref rid="a">link to chapter 1</xref></p>
                <p> some text with a <xref rid="b">link to chapter 2</xref></p>
                <p id="b">a target id in chapter 1</p>
            </body>
        </book-part>
    </body>
</book>

输出book.123.4567890.ch01.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//NLM//DTD Book DTD v2.1 20050630//EN" "book.dtd">
<book dtd-version="3.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table">
    <book-meta>
        <book-id>123.4567890</book-id>
    </book-meta>
    <body>
        <book-part book-part-type="chapter" id="book.123.4567890.ch01">
            <book-part-meta>
                <title-group>
                        <title>Chapter 1</title>
                </title-group>
            </book-part-meta>
            <body>
                <p> some text with a <xref rid="a">link to chapter 1</xref></p>
                <p> some text with a <related-object document-type="chapter" object-id="book.123.4567890.ch02.xml#b">link to chapter 2</related-object></p>
                <p id="a">a target id in chapter 1</p>
            </body>
            </book-part>
    </body>
</book>

输出book.123.4567890.ch02.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//NLM//DTD Book DTD v2.1 20050630//EN" "book.dtd">
<book dtd-version="3.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table">
    <book-meta>
        <book-id>123.4567890</book-id>
    </book-meta>
    <body>
        <book-part book-part-type="chapter" id="book.123.4567890.ch02">
            <book-part-meta>
                <title-group>
                <title>Chapter 2</title>
                </title-group>
            </book-part-meta>
            <body>
                <p> some text with a <related-object document-type="chapter" object-id="book.123.4567890.ch01.xml#a">link to chapter 1</related-object></p>
                <p> some text with a <xref rid="b" >link to chapter 2</xref></p>
                <p id="b">a target id in chapter 1</p>
            </body>
        </book-part>
    </body>
</book>

1 个答案:

答案 0 :(得分:2)

简短的回答是:是的,你已经正确理解了你需要做什么。

对于每个超链接,您需要弄清楚其目标是否与链接源位于同一输出文件中,或者是否与其他链接相同。您已经在此处正确识别了挑战:了解新文件名将是什么。它并不像最初看起来那么困难;深吸一口气然后解决它。

你是一个外部参照元素;它有一个rid属性。您想知道:外部参照和目标是在同一个输出文件中还是在不同的文件中?要做出决定,你必须

  • 从外部参照元素上升到包含书籍部分,并确定其文件名是什么。将此值放在变量(fn-xref)中。
  • 转到目标元素(id(@rid)),然后从该元素上升到包含书籍部分,并找出其文件名是什么。将此值放在变量(fn-rid)中。
  • 比较$ fn-xref和$ fn-rid的值。如果他们是平等的,做正确的事。如果他们不同,做另一件事。

我猜你不需要帮助将这篇散文描述转化为XSLT,但如果你这样做,请说出来。