У меня есть список Sharepoint, который я хочу преобразовать в JSON через представление данных XSL.
У меня есть функция рекурсивной замены XSL, которую я использую для замены всех специальных символов (обратной косой черты, двойных кавычек на & quot; и т. Д.), Что дает мне хороший чистый JSON, который правильно анализируется в браузере пользователей.
Последнее, что мне нужно, чтобы избежать / заменить это новая строка char. Новая строка вызывает ошибки при разборе JSON в некоторых браузерах.
Вот некоторый xsl, который проверяет, имеет ли содержимое заголовка новую строку char, если он выводит абзац:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="catalog/cd">
<xsl:if test='contains(title,"
")'>
<p>Found <xsl:value-of select="title" /></p>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Вот пример XML:
<catalog>
<cd>
<title>Empire
Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
</catalog>
«Империя бурлеска» должна быть единственным элементом, который пройдет тест, но все три заголовка проходят оператор if и выводятся.
EDIT
Модифицируя решение, приведенное ниже, я полагаю, это должно работать, если я хочу выполнить поиск и замену для отдельных узлов? Я не смогу проверить это в Sharepoint до завтра.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="catalog/cd">
<xsl:variable name="title_clean">
<xsl:call-template name="repNL">
<xsl:with-param name="pText" select="title"/>
</xsl:call-template>
</xsl:variable>
<p><xsl:value-of select='$title_clean' /></p>
</xsl:for-each>
</xsl:template>
<xsl:template name="repNL">
<xsl:param name="pText" select="."/>
<xsl:copy-of select="substring-before(concat($pText,'
'),'
')"/>
<xsl:if test="contains($pText, '
')">
<br />
<xsl:call-template name="repNL">
<xsl:with-param name="pText" select=
"substring-after($pText, '
')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>