У меня есть руководство по деталям, состоящее из набора нескольких XML-файлов, сегментированных по разным группам деталей. Каждая группа деталей содержит несколько таблиц с информацией, относящейся к отдельным деталям, включая уникальный номер детали. Каждая отдельная часть содержится в виде одной строки в таблице. Я добавил в эти таблицы пустой столбец, который будет указывать, ограничена ли продажа детали значением «да» или «нет», когда я запускаю ее через свое преобразование.
Я написал преобразование XSLT, чтобы найти номер детали в файле поиска, сравнить его с номером детали в документе, который я обрабатываю, и, когда они совпадают, заполнить пустой столбец «да» или «нет» в зависимости от того, что указан в XML-документе поиска.
Каталожные номера уникальны. Однако некоторые детали используются с несколькими группами деталей. Хотя руководство по деталям состоит из нескольких файлов XML, файл поиска, который я использую, основан на спецификации. Итак, это один большой XML-документ, содержащий все части для каждой группы.
XML-документ, который я обрабатываю, выглядит так:
<reference>
<title>Part Group A</title>
<refbody>
<section>
<image href="partGroupA.svg"/>
</section>
<simpletable>
<sthead>
<stentry>Annotation</stentry>
<stentry>Part Name</stentry>
<stentry>Restricted?</stentry>
<stentry>Part Description</stentry>
<stentry>Part Number</stentry>
<stentry>Quantity</stentry>
<stentry>Comment</stentry>
</sthead>
<strow>
<stentry translate="no" props="annotation">1</stentry>
<stentry translate="no" props="part-name">SomePart</stentry>
<stentry translate="no" props="part-restrict"></stentry>
<stentry translate="yes" props="part-desc">SomePart</stentry>
<stentry translate="no" props="part-number">1234567-00-A</stentry>
<stentry translate="no" props="quantity">1</stentry>
<stentry translate="yes" props="comment">Some comment</stentry>
</strow>
<strow>
<stentry translate="no" props="annotation">2</stentry>
<stentry translate="no" props="part-name">AnotherPart</stentry>
<stentry translate="no" props="part-restrict"></stentry>
<stentry translate="yes" props="part-desc">AnotherPart</stentry>
<stentry translate="no" props="part-number">2345678-00-A</stentry>
<stentry translate="no" props="quantity">1</stentry>
<stentry translate="yes" props="comment">Another comment</stentry>
</strow>
...
</simpletable>
</refbody>
</reference>
XML-документ поиска содержит следующее:
...
<strow>
<stentry props="part-section">Part Group A</stentry>
<stentry props="part-name">SomePart</stentry>
<stentry props="part-number">1234567-00-A</stentry>
<stentry props="part-restrict">Yes</stentry>
</strow>
<strow>
<stentry props="part-section">Part Group A</stentry>
<stentry props="part-name">AnotherPart</stentry>
<stentry props="part-number">2345678-00-A</stentry>
<stentry props="part-restrict">No</stentry>
</strow>
...
<strow>
<stentry props="part-section">Part Group B</stentry>
<stentry props="part-name">SomePart</stentry>
<stentry props="part-number">1234567-00-A</stentry>
<stentry props="part-restrict">No</stentry>
</strow>
...
Мое XSLT-преобразование выглядит так:
<xsl:output method="xml" encoding="UTF-8" indent="yes" doctype-system="reference.dtd" doctype-public="-//OASIS//DTD DITA Reference//EN"/>
<xsl:strip-space elements="*"/>
<xsl:key name="part-number" match="strow" use="stentry[@props='part-number']" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="stentry[@props='part-restrict']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:variable name="matching-part" select="key('part-number', ../stentry[@props='part-number'], document('pm_restrict_redo-2.xml'))" />
<xsl:choose>
<xsl:when test="$matching-part">
<xsl:value-of select="$matching-part/stentry[@props='part-restrict']"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
Это работает до определенного момента. Поскольку в некоторых случаях номер детали используется несколько раз в разных группах деталей (для разных систем, подсистем и т. д.) и несколько раз указывается в поиске спецификации, мое преобразование заканчивается выводом «да» или «нет» для каждого возникновение части. Результирующий XML выглядит следующим образом:
<strow>
<stentry translate="no" props="annotation">1</stentry>
<stentry translate="no" props="part-name">SomePart</stentry>
<stentry translate="no" props="part-restrict">yes no</stentry>
<stentry translate="yes" props="part-desc">SomePart</stentry>
<stentry translate="no" props="part-number">1234567-00-A</stentry>
<stentry translate="no" props="quantity">1</stentry>
<stentry translate="yes" props="comment">Some comment</stentry>
</strow>
Что я пытаюсь сделать, так это преобразовать XML, связанный с определенной группой частей, и ограничить список значений «да» или «нет» тем, что захвачено для этой группы частей. Вместо этого я получаю все значения «да» и «нет» для каждого вхождения детали в спецификацию.
Любая помощь приветствуется.
<xsl:variable name="vLookup" select ="document(your-document-uri)">
13.04.2015<xsl:sequence>
, чем<xsl:value-of>
. В случае, когда выводятся строки, результаты от использования обеих инструкций одинаковы, однако здесь у меня однострочное то, что в оригинале было 8-строчным<xsl:choose>
. Я вывожу последовательностьtext()
дочерних элементов двух элементов, из которых может существовать только один:$matching-part/stentry
или текущий узел.
, когда$matching-part
является пустой последовательностью. Это короткий и лучший эквивалент выражения<xsl:choose>
, а также выражения XPath 2.0 if-then-else. 14.04.2015