/ / Wyszukaj ciąg w XML, który dopasowuje jego zakończenie do jednego Substringu i zawiera inny ciąg - xml, xslt

Wyszukaj ciąg w XML, który pasuje do końca z jednym Substringiem i zawiera inny podciąg - xml, xslt

Jak mogę zamienić ciąg będący pod elementem CData w XML? Tutaj próbuję dopasować na 2 warunkach, jak poniżej:

<xsl:template match="@*[ends-with((local-name(),"mustEndWithThisSubstring"))] and not(contains((local-name(),"mustContainThisSubstring")))" >

1- Jak uzyskać wiele warunków dla sekcji "xsl: match" ?

2- Jak zastąpić ciąg dopasowany na (nieznany) do żądanego ciągu znaków (znany) ?

Zobacz poniższy fragment.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" cdata-
section-elements=replacingWith"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="@*[ends-with((local-name(),"mustEndWithThisSubstring"))] and not(contains((local-name(),"mustContainThisSubstring")))" >
<xsl:copy>
<replacingWith"/>
<xsl:value-of select="substring-after(., "&lt;foundStringThatMatchesConditions>"), "&lt;/foundStringThatMatchesConditions>")"/>
</replacingWith>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

Wkład:

<soap:Body>
<pre:getResponse>
<![CDATA[
<foundStringThatMatchesConditions>
.......
</foundStringThatMatchesConditions>
]]>
</pre:getResponse>
</soap:Body>

Wydajność:

<soap:Body>
<pre:getResponse>
<![CDATA[
<replacingWith>
.......
</replacingWith>
]]>
</pre:getResponse>
</soap:Body>

Odpowiedzi:

1 dla odpowiedzi № 1

Jak mogę zamienić ciąg będący pod elementem CData w XML?

Dokładnie sposób zastąpienia ciągu w wartościdowolnego innego węzła tekstowego. Co oznacza, że ​​rozróżnienie nie jest dokonywane po przeanalizowaniu danych znakowych uzyskanych z sekcji CDATA w dokumencie wejściowym i innych danych znakowych. Wszystkie są reprezentowane jako węzły tekstowe w modelu danych XPath używanym również przez XSLT. W rzeczywistości są one przedmiotem scalania, więc żaden węzeł tekstowy nie ma następnego węzła tekstowego jako bezpośrednio po nim. text() jest testem węzła dopasowującym specjalnie węzły tekstowe.

Zwróć szczególną uwagę na zawartość CDATAsekcja nie ma żadnej struktury w odniesieniu do XSLT. Gdzie CDATA jest używany do osadzania XML w innym dokumencie XML, zawartość sekcji nie może być dostępna (bezpośrednio) tak, jakby były XML. Do celów dokumentu gospodarza nie są one dostępne.

XSLT 1.0 nie ma wbudowanej funkcji wyszukiwania i zamiany podłańcuchów, ale można to zrobić - przy odrobinie wysiłku - za pomocą szablonu. Patrz: substring-before(), substring-after(), I może contains() Funkcje.

Ty też pytasz,

1- Jak uzyskać wiele warunków dla sekcji "xsl: match"?

Można podać wiele predykatów lub użyć operatorów boolowskich w celu połączenia warunków wewnątrz tego samego predykatu. Na przykład,

<xsl:template match="@*[ends-with(local-name(),"mustEndWithThisSubstring") and not(contains(local-name(),"mustContainThisSubstring"))]" >

lub

<xsl:template match="@*[ends-with(local-name(),"mustEndWithThisSubstring")][not(contains(local-name(),"mustContainThisSubstring"))]" >

Gdzie jest operator relacyjny andTe dwie formy mają podobną, ale nie identyczną semantykę. Zauważ jednak, że te konkretne wyrażenia pasują do siebie atrybuty (@*), które nie mogą zawierać ani być zawarte w CDATA.

2- Jak zamienić ciąg dopasowany na (nieznany) na pożądany ciąg (znany)?

Możesz nie wiedzieć z góry który ciąg będzie dopasowywany, ale na pewno wiesz w kontekście odpowiedniego szablonu, z którym dopasowywany jest tekst. W wyrażeniach powyżej jest to wartość zwracana przez local-name() funkcjonować. Jeśli chcesz, możesz przechwycić to w zmiennej lub przekazać do innego szablonu jako parametr. Jak już powiedziałem, możliwe jest napisanie szablonu do obsługi zadania zamiany ciągów znaków. Szczegóły są pozostawione jako ćwiczenie.