Я пытаюсь измениться, рендеринг столбца списка в списке просматривают страницу.
После нескольких учебных руководств и некоторых волос, вытягивающих, мне удалось создать 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>
Как оказалось, это полностью проблема 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, остается загадкой.