Пользовательский xsl, представляющий для поля поиска в представлении списка (SharePoint 2010)

Я пытаюсь измениться, рендеринг столбца списка в списке просматривают страницу.

После нескольких учебных руководств и некоторых волос, вытягивающих, мне удалось создать xslt для расчетного поля и поля валюты (от fldtypes_XXXXXX.xsl):

<xsl:template match ="FieldRef[@Name='MarkCalc']" mode="Text_body">
  <xsl:param name="thisNode" select="."/>
  <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping ="yes"/>
</xsl:template>

<xsl:template match="FieldRef[@Name='CurrencyTest']" mode="Number_body">
  <xsl:param name="thisNode" select="."/>
  <b><xsl:value-of disable-output-escaping="yes" select="$thisNode/@*[name()=current()/@Name]" /></b>
</xsl:template>

Затем я пытался сделать то же для поля поиска, но оно просто не будет работать. Это - моя последняя попытка (я скопировал ее от разработчика SharePoint). Что я пропускаю?

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body">
  <xsl:param name="thisNode" select="."/>
  <b><xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes" /></b>
</xsl:template>
5
задан Luc 31 May 2010 в 13:44
поделиться

1 ответ

Как оказалось, это полностью проблема xsl.

Процессор Xsl выбирает шаблон для использования на основе атрибутов "match" и "mode". Если два или более шаблона совпадают, выбирается тот, который будет использоваться, по приоритету. По умолчанию существует три уровня приоритетов, которые назначаются в зависимости от того, насколько специфично ваше соответствие.

Из http://www.codetoad.com/xml/xslt8.asp:

  • Шаблонам, которые соответствуют классу узлов, например *, который соответствует всем элементам, присваивается неявный приоритет. элементы, присваивается неявный приоритет -0.5

  • Шаблонам, которые соответствуют узлам по их имени, таким как Character, который соответствует элементам, присваивается неявный приоритет 0

  • Шаблоны, которые соответствуют узлам в соответствии с их контекстом, такие как CastMember/Character, который соответствует элементам, чьим родителем является элемент, присваивается неявный приоритет 0.5

При назначении приоритетов на основе шаблонов, не имеет значения, насколько насколько конкретной является информация о контексте: если вы укажете любой контекст для узла то шаблон имеет приоритет 0.5. Например, Описание/Ссылка/Характер имеет точно такой же приоритет, как Description//Character.

В SharePoint есть два шаблона для полей поиска

<xsl:template name="FieldRef_Lookup_body" match="FieldRef" mode="Lookup_body" ddwrt:dvt_mode="body">...

и

<xsl:template match="FieldRef[@Encoded]" mode="Lookup_body" ddwrt:dvt_mode="body">

Первый имеет приоритет 0 (соответствие по имени), второй - приоритет 0.5 (соответствие по контексту).

Мой пользовательский шаблон, который должен перекрывать кодированный lookup

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body">...

также имеет приоритет по умолчанию 0.5 (помните, "...не имеет значения, насколько специфична контекстная информация..."), поэтому xsl-процессор выбирает последний из определенных(*).

Чтобы преодолеть это, вы можете использовать атрибут priority и установить его на более высокое значение, чем у шаблона по умолчанию. В моем случае я установил значение 1.

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" priority="1" mode="Lookup_body">...



(*) Очевидно, SharePoint загружает пользовательские шаблоны до загрузки своих собственных. Был ли это выбор, основанный на каких-то технических критериях или для того, чтобы я изучил xsl, остается загадкой.

8
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: