2012-01-01 22 views
-1

Используя XSLT 1.0, я хочу обработать четыре набора узлов по порядку, A, B, C, D. Но я не могу указать каждый набор узлов с помощью одиночное (или, по крайней мере, не управляемое) выражение XPath.Назначить значение узлу в дереве, которое обрабатываю

Я хотел бы, прямо перед собой, пронестись и пометить все узлы, в которых я хочу быть A, все узлы, которые я хочу быть B, и т. Д., А затем вы сможете выбрать по желанию все A узлы, все узлы B и т. д.

Я также хочу добавить к списку позже.

Я не могу создать атрибуты в обрабатываемом файле. (Правильно?) Переменные выходят за рамки слишком скоро. Может быть, что-то использует ключи? Ключ для всех A, всех B? Но можно ли добавить дополнительные узлы в таблицу ключей после создания ключа?

Или есть способ сохранить XPaths?

Есть ли простой способ сделать это, или я должен просто создать скверное, ужасное, подверженное ошибкам, ужасное и поддерживающее выражение Xpath каждый раз, когда я хочу выбрать каждый из моих наборов узлов?

+1

Кажется слишком общий характер - - Вы ожидаете узнать все XPath и XSLT как ответ на один вопрос? Если это так, лучший ответ: получить и прочитать хорошую книгу о XSLT/XPath. Вот ссылки на некоторые из лучших ресурсов: http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 –

+1

Вы думаете с точки зрения процедурного решения проблемы, и вы разочаровываетесь, потому что XSLT является декларативным языком и не разрешает процедурного решения. Если вы попытаетесь объяснить нам проблему, которую вы пытаетесь решить (вместо вашего процедурного подхода к ее решению), мы можем помочь вам. –

+0

Спасибо, Майкл. При преобразовании на стороне клиента я обрабатываю, по порядку, четыре набора узлов, каждый из которых определяется сложным выражением XPath. Мне нужно обрабатывать те же самые четыре набора несколько раз при рендеринге HTML. Как я могу избежать повторения выражений XPath в моем XSL каждый раз, когда мне нужно обработать четыре набора? – JPM

ответ

0

Решение: Используйте глобальные переменные, как это:

<xsl:variable name="A" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title" /> 
<xsl:variable name="B" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:author" /> 
<xsl:variable name="C" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:sponsor | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:funder  | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:principal | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:respStmt | 
           //tei:teiHeader/tei:fileDesc/tei:editionStmt    | 
           //tei:teiHeader/tei:fileDesc/tei:extent     | 
           //tei:teiHeader/tei:fileDesc/tei:seriesStmt" /> 
<xsl:variable name="D" select="//tei:teiHeader/tei:fileDesc/tei:notesStmt/tei:note" /> 

Тогда позже:

<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$A" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$B" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$C" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$D" /> 
</xsl:call-template> 

повторяется так часто, как это необходимо, без необходимости повторять выражения Xpath.

(Michael, ваш комментарий «Люди часто не понимают, что определения глобальных переменных может ссылаться на исходный документ» отправил в dpawson.co.uk, у меня, глядя в правой области.)

+0

Или добавьте ключ, который также является глобальным и может быть установлен с запросами XPath в дерево. Пример приведен здесь: http://stackoverflow.com/questions/8703217. – JPM

Смежные вопросы