Моя компания выпускает публикацию, которая выводит клиентам текущий набор диаграмм,
В публикации можно найти диаграммы с заданным значением атрибута.
Это работает, но только если значение содержится в первом узле атрибута.
Я и другой парень пытались это исправить, чтобы он искал все атрибуты.
Вот фрагмент xsl, используемый для поиска атрибутов. Он просматривает элементы «Папка» и «Элементы формы», чтобы определить, содержит ли дочерний элемент «Атрибут» слово, введенное пользователем.
<xsl:template name="testObject">
<xsl:if test="(name() = 'Shape' and $includeShapes) or (name() = 'Folder' and $includeFolders) or (name() = 'Document' and $includeDocuments) or (name() = 'Diagram' and $includeDiagrams)">
<xsl:variable name="objXMLLocation">
<xsl:choose>
<xsl:when test="name() = 'Folder'">
<xsl:value-of select="concat(@ID, '/folder.xml')" />
</xsl:when>
<xsl:when test="name() = 'Document'">
<xsl:value-of select="concat(@ID, '/document.xml')" />
</xsl:when>
<xsl:when test="name() = 'Diagram'">
<xsl:value-of select="concat(@ID, '/diagram.xml')" />
</xsl:when>
<xsl:when test="name() = 'Shape'">
<xsl:value-of select="concat(../../@ID, '/', ../../@ID, '_files/', @Source)" />
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:if test="js:fileExists($objXMLLocation)">
<xsl:variable name="objXML" select="document($objXMLLocation)" />
<xsl:choose>
<xsl:when test="$searchName">
<xsl:if test="js:containsKeywords($objXML/*/Properties/RepositoryName, $searchKeywords)">
<xsl:apply-templates mode="render" select=".">
<xsl:with-param name="fullXML" select="$objXML" />
</xsl:apply-templates>
</xsl:if>
</xsl:when>
<xsl:when test="$searchDescription">
<xsl:if test="js:containsKeywords($objXML/*/Properties/Description, $searchKeywords)">
<xsl:apply-templates mode="render" select=".">
<xsl:with-param name="fullXML" select="$objXML" />
</xsl:apply-templates>
</xsl:if>
</xsl:when>
<xsl:when test="$searchAttributes">
<xsl:if test="name() != 'Folder'">
<xsl:if test="js:containsKeywords($objXML/*/CustomAttributes/Attribute/Value,$searchKeywords)">
<xsl:apply-templates mode="render" select=".">
<xsl:with-param name="fullXML" select="$objXML" />
</xsl:apply-templates>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:if>
</xsl:template>
Вот функция Javascript, содержащая ключевое слово, которое она ищет, чтобы увидеть, существуют ли подстроки в параметре иглы, которые являются поисковыми словами, введенными пользователем, внутри параметра стога сена, который является значением элемента или атрибута, который пользователь ищет в публикации , Я сам не уверен в том, что именно происходит, но, похоже, это работает правильно.
function containsKeywords(haystack, needles) {
var ks = needles[0].selectNodes('//K');
var n;
if (haystack[0].firstChild) {
n = haystack[0].firstChild.nodeValue.toUpperCase();
} else {
return 0;
}
for (var i = 0; i < ks.length; i++) {
if (n.indexOf(ks[i].firstChild.nodeValue) < 0) {
return 0;
}
}
return 1;
}
Просматриваемый xml.
<Diagram ID="49ab6eb5-c51f-4e36-9495-869897ef0d0d">
<CustomAttributes>
<Attribute>
<Name>Approval Status</Name>
<Description>Document / Diagram / Object Approval Status</Description>
<Value>Draft - Work in Progress</Value>
<Datatype>Text</Datatype>
</Attribute>
<Attribute>
<Name>Next Document Review Date</Name>
<Description>When is this document to be reviewed next?</Description>
<Value />
<Datatype>Date</Datatype>
</Attribute>
<Attribute>
<Name>Stakeholder View</Name>
<Description>Select the Stakeholder View</Description>
<Value>PMO</Value>
<Datatype>Text</Datatype>
</Attribute>
Текущий xsl отобразит ссылку на диаграмму, если для параметра Черновик введено значение в том виде, в каком оно существует в дочернем элементе Значение элемента 1-го атрибута. Но поиск PMO ничего не даст.
Проблема в том, что xsl будет смотреть только на первый элемент Attribute, когда ему нужно будет просмотреть все дочерние элементы в элементе CustomAttribute.
Мы попытались с помощью for-each пройти через все элементы Attribute, у нас возникли проблемы при обходе дерева xml, чтобы получить предка Diagram, чтобы его можно было выбрать для рендера.
Спасибо.